MySQL 4

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..

[JDBC] MySQL 드라이버 Class.forName()의 비밀 - 로드만 했을 뿐인데 getConnection()이 가능하다고?

도대체 JDBC드라이버는 Class.forName()으로 로딩만 했을 뿐인데 어떻게 DriverManager 에서 사용이 되는 것일까? Class.forName의 호출 Class 클래스는 JVM에서 동작할 클래스들의 정보를 묘사하기 위한 일종의 메타 클래스이다. 객체의 참조 카운트가 0가 되면 해당 인스턴스는 더 이상 가리키는 참조 변수가 없는 것이므로 GC의 대상이 된다. 그런데 JDBC는 생성시키고 끝난다. 그러면 GC가 되지 않도록 하는 무언가가 있다고 한다. JDBC 드라이버와 같이 인스턴스를 별도로 관리하지 않는 대부분의 클래스의 경우, 그 클래스가 스스로의 인스턴스를 정적 블록을 통해 생성하고 관리한다. 정적 블록을 갖는 클래스들은 Class.forName() 만 호출해도 초기화가 수행된다. ..

반응형