전체 글 249

MySQL eq_range_index_dive_limit 를 활용한 쿼리 수행시간 개선 및 실무에서 발생할 수 있는 연관된 문제

배경 의도치 않게 쿼리 수행시간이 증가하거나 이슈가 발생하는 부분 중 하나인 쉽게 발생하지만 원인파악이 쉽지 않은 부분에 대한 내용입니다. IN절로 인한 쿼리 수행시간이 증가하는 것에 따른 원인파악과 해결방법에 대해서 다룹니다. IN절에 들어가는 개수에 따라 쿼리 수행시간이 급격하게 나빠지는 경우가 존재하기 때문입니다. 설정값 eq_range_index_dive_limit eq_range_index_dive_limit IN 절에 길게 중첩되었을때 쿼리 속도를 높이는데 사용되는 값이다. 이 값 이상이라면 옵티마이저는 인덱스 다이빙을 수행하지 않고 기존 인덱스 통계를 사용한다. 0으로 설정하면 항상 인덱스 다이빙을 수행한다. 아래와 같은 쿼리가 있을 때, col_name IN(val1, ..., valN) ..

MySQL의 Between 쿼리 개선하기

본 글은 RealMySQL 도서를 스터디하며 읽은 내용 + 실습한 내용입니다. Between을 써서 쿼리를 작성하는데 있어서 비효율적으로 탈 수 있는 쿼리를 개선해 볼 수 있는 내용을 다루었습니다. 테스트 데이터 세팅 실습을 하려면 실제 쿼리를 수행해보고 실행계획을 확인할 수 있는 환경이 필요하다. 먼저 테이블은 컬럼을 간단히 만들었다. (id, position, no) 3개의 컬럼이 있는데 position은 직원의 직책이고 no는 사번이라고 생각하면 된다. 인덱스는 (position + no)에 걸어놓았다. 테스트를 위해서 데이터세팅을 해보았다. 아래와 같이 대충 insert가 되도록 하였다. @Component public class Runner implements CommandLineRunner {..

MySQL 잠금과 Isolation level에 대해서

트랜잭션은 작업의 완전성을 보장해줍니다. 함께 수행되어야 하는 작업들을 묶어서 전부 완벽하게 처리하거나 하나라도 처리가 되지 않으면 다시 원상태로 돌리는 작업을 하는 것을 의미합니다. 잠금과 트랜잭션은 비슷하면서 다릅니다. 잠금: 동시성을 제어하기 위함 → 여러 커넥션에서 동시에 같은 레코드나 테이블에 접근하여 변경할 경우 결과적으로 예측할 수 없는 값이 됨. 트랜잭션: 데이터의 정합성을 보장하기 위함. 격리수준이라는 것을 정의할 수 있는데 이것은 하나 혹은 여러 트랜잭션에서 작업내용을 어떻게 공유하고 차단할지를 결정하는 것입니다. 트랜잭션 트랜잭션은 묶여있는 논리적 작업 단위들이 전부 반영되거나 오류발생 시 하나도 반영되지 않아야 합니다. MySQL의 스토리지 엔진에 따라도 차이가 있는데요. MyISA..

웹사이트 속도가 왜 중요한 것인가

소비자는 디지털 컨텐츠나 서비스에 접근하기 위해서 기기에 의존하게 되는데, 당신의 사이트 분석도구를 보았을 때 당신의 데이터가 어떻게 되고 있는지 볼 수 있을 것입니다. 소비자들은 예전보다 더 쉽게 만족하지 않습니다. 그리고 당신의 사이트 경험을 평가할 때 당신의 경쟁자와 비교하여 평가하지 않고 사람들이 매일 쓰는 동종 최고의 서비스와 비교를 합니다. (원문에서는 best-in-class라고 표현을 하네요. 우리가 흔히 이용하는 각 분야별 원탑 서비스와 비교를 한다고 생각하면 됩니다. 우버, 유튜브, 넷플릭스 같은 서비스 말이죠) 이 글은 성능(performance)과 사업적 성공과의 관계에 대한 연구를 모아 봅니다. 성능은 사용자 유지의 관한 것이다 성능은 회사의 핵심적인 부분(수익)에 직접적인 영향을..

Netflix Hystrix를 사용한 클라이언트 회복성 전략 개념정리

본 글은 사내 업무에서 발생한 이슈에 대해 복기를 하면서 해당 내용이 잘 정리되어 있는 '스프링마이크로서비스 코딩공작소'의 내용을 정리하면서 실습한 내용의 일부입니다. 서론 모든 시스템, 특히 분산 시스템은 장애를 겪습니다. '회복력'을 갖춘다는 것에 있어서 대부분의 소프트웨어 엔지니어는 완전한 장애만을 고려합니다. 다음과 같은 이유로 이렇게 일부분 (완전한 장애)만을 고려하게 되는데요. 서비스 degradation(저하)는 간헐적으로 발생하고 확산될 수 있음: 사소한 부분에서 시작된 것이 초기에는 일부사용자의 불평이지만 그것이 완전한 장애로 이어질 수 있습니다. 애플리케이션이 대부분 부분적인 저하가 아닌 원격 자원의 완전한 장애를 처리하도록 설계한다: 결과적으로 자원 고갈이 진행되면 호룰하는 클라이언트..

AWS VPC 기본 개념 정리 - VPC를 구성하는 기본 원리

선수 지식 VPC를 이해하기 위해서 선수 지식이 좀 필요한데 아주 간단하게만 보고 가겠습니다. IP주소는 32자리 2진수인데 총 개수는약 40억개정도 됩니다. 그리고 (네트워크 주소 + 호스트 주소) 로 구성이 됩니다. 네트워크 주소는 아파트 주소, 호스트 주소는 호수로 이해하면 알기 쉽습니다. 정확한 주소로 찾아가려면 일단 아파트 주소로 가서 구체적인 호수를 찾아야겠죠. 출처) http://korean-daeddo.blogspot.com/2015/12/ip.html IP 주소를 8비트로 4등분을 한다면 각각을 옥탯이라 부릅니다. 각 옥탯별로 0~255개의 범위이므로 총 256개가 들어간다는걸 알 수 있습니다. 그리고 이 옥탯 별로 IP의 클래스를 A,B,C로 나눌 수 있습니다. 위에서 언급한 A 클래스..

Dynamo DB 공식 문서 정리 1편 - 핵심 구성 요소

AWS에서 사용할 수 있는 Dynamo DB 에 대한 내용 정리 1편 핵심 구성 요소 입니다. 필요한 내용을들을 선별 하여 정리하였습니다. 핵심 구성 요소 (Core Components) 다이나모 디비에서 테이블, 항목 및 속성은 핵심 구성요소입니다. 테이블은 항목의 집합이고 각 항목은 속성의 집합입니다. 다이나모 디비는 primary key를 이용하여 각 항목을 고유하게 식별하고 보조 인덱스를 이용하여 유연하게 쿼리를 만들수 있게 해줍니다. 테이블 (Table) 테이블은 여타 데이터베이스와 마찬가지로 생각하면 됩니다. 항목 (Items) 항목은 모든 다른 항목들 중에서 고유하게 식별할 수 있는 속성들의 집합입니다. 다이나모 디비에서는 테이블에 저장하는 항목의 수의 제한이 없습니다. 속성 (Attribu..

Jackson 라이브러리 기본기능 정리 - json 직렬화와 역직렬화

Jackson Annotation 예제 본 글은 다음 원문을 번역 및 수정한 글입니다. https://www.baeldung.com/jackson-annotations 전체 코드는 다음 레파지토리에 있습니다. 필요하다면 클론 받으셔서 test 패키지에 있는 JacksonTest.class 를 보시면 한 눈에 볼 수 있습니다. https://github.com/JunHoPark93/jackson-practice JunHoPark93/jackson-practice Practice for jackson library. Contribute to JunHoPark93/jackson-practice development by creating an account on GitHub. github.com Jackson ..

CompletableFuture - 안정적 비동기 프로그래밍에 대해 - (1)

CompletableFuture - 안정적 비동기 프로그래밍 모든 코드는 깃허브에 있습니다. https://github.com/JunHoPark93/completablefuture-practice JunHoPark93/completablefuture-practice Contribute to JunHoPark93/completablefuture-practice development by creating an account on GitHub. github.com 이 글은 모던 자바인 액션이라는 책을 보고 정리한 내용입니다. Future 의 단순 활용 - 기존의 한계 자바 5부터 미래 시점에 결과를 얻을 수 있는 Future 인터페이스를 제공하고 있습니다. 시간이 걸릴 수 있는 작업을 Future 내부로 작성..

Enum 조회 성능 높여보기 - HashMap을 이용해서 빠르게 조회해보자

Enum 조회 성능 높여보기 자바의 Enum 에서 매핑을 할 때 find 메서드를 정의해서 알맞는 enum 을 찾는 로직을 많이 구현해본적이 있을 것 같아요. 다음과 같은 코드가 익숙하실텐테요. 저도 이런식으로 하다가 어느 날 친구가 인사이트를 주어 개선할 부분이 있는 것 같아 실험을 해보았습니다. 먼저 간단한 AccountStatus enum을 보겠습니다. package com.jaytech.codepractice; import java.util.stream.Stream; import lombok.Getter; @Getter public enum AccountStatus { INUSE("사용중"), UNUSED("미사용"), DELETED("삭제"), UNKNOWN("알수없음"); private fin..

반응형