옵티마이저 힌트

책너두 6기 36일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.382 ~ p.392 내용정리 09 옵티마이저와 힌트 9.4 쿼리 힌트 9.4.2 옵티마이저 힌트 9.4.2.2 MAX_EXCUTION_TIME 유일하게 쿼리의 실행 계획에 영향을 미치지 않는 힌트. 단순히 쿼리의 최대 실행 시간을 설정하는 힌트 9.4.2.3 SET_VAR 시스템 변수를 조정한다. 실행계획을 바꾸거나, 조인 버퍼나 정렬용 버퍼(소트 버퍼)의 크기를 일시적으로 증가시켜 대용량 처리 쿼리의 성능을 향상시키는 용도로 사용. 9.4.2.4 SEMIJOIN & NO_SEMIJOIN 앞에서 살펴본 각 세미 조인의 최적화를 사용할 지 선택은 SEMIJOIN 힌트로 제어할 수 있다. ...

2023년 10월 21일 · 2 분 · 배준수

힌트

책너두 6기 35일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.370 ~ p.381 내용정리 09 옵티마이저와 힌트 9.4 쿼리 힌트 옵티마이저에게 쿼리의 실행 계획을 어떻게 수립해야 할지 알려줄 수 있는 방법. 인덱스 힌트와 옵티마이저 힌트 2가지로 구분한다. 9.4.1 인덱스 힌트 SQL의 문법에 맞게 사용해야 해서 ANSI-SQL 표준 문법을 준수하지 못하는 단점이 있다. 따라서 가급적 옵티마이저 힌트를 쓸 것이 권장된다. 9.4.1.1 STRAIGHT_JOIN 옵티마이저 힌트인 동시에 조인 키워드이기도 하다. SELECT, UPDATE, DELETE쿼리에서 여러 개의 테이블이 조인되는 경우 조인 순서를 고정하는 역할을 한다. ...

2023년 10월 20일 · 2 분 · 배준수

조인 최적화 알고리즘

책너두 6기 34일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.356 ~ p.369 내용정리 09 옵티마이저와 힌트 9.3 고급 최적화 9.3.1 옵티마이저 스위치 옵션 9.3.1.19 해시 조인(hash_join) 해시 조인은 첫 번째 레코드를 찾는 데는 시간이 많이 걸리지만 최종 레코드를 찾는 데까지는 시간이 많이 걸리지 않는다. 네스티드 루프 조인은 마지막 레코드를 찾는 데까지는 시간이 많이 걸리지만 첫 번째 레코드를 찾는 것은 상대적으로 훨씬 빠르다. 따라서 해시 조인 쿼리는 최고 스루풋(Best Throughput)에 적합하고 네스티드 루프 조인은 최고 응답 속도(Best Response-time)에 적합하다. 일반적인 웹 서비스는 온라인 트랜잭션(OLTP)서비스이기 때문에 스루풋도 중요하지만 응답 속도가 더 중요하다. 반면 분석과 같은 서비스는 전체적으로 처리 소요 시간이 더 중요하다. ...

2023년 10월 19일 · 2 분 · 배준수

세미 조인과 관련된 최적화들

책너두 6기 33일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.344 ~ p.355 내용정리 09 옵티마이저와 힌트 9.3 고급 최적화 9.3.1 옵티마이저 스위치 옵션 9.3.1.13 구체화(Materialization) 세미 조인에 사용된 서브쿼리를 통째로 구체화해서 쿼리를 최적화한다는 의미. 내부 임시 테이블을 생성한다는 의미이다. 제한 사항과 특성 IN에서 서브쿼리는 상관 서브쿼리(Correlated subquery)가 아니어야 한다. 서브쿼리는 GROUP BY나 집합 함수들이 사용돼도 구체화를 사용할 수 있다. 구체화가 사용된 겨웅에는 내부 임시 테이블이 사용된다. 9.3.1.14 중복 제거(Duplicated Weed-out) 세미 조인 서브쿼리를 일반적인 INNER JOIN 쿼리로 바꿔서 실행하고 마지막에 중복된 레코드를 제거하는 방법으로 처리되는 최적화 알고리즘 ...

2023년 10월 18일 · 2 분 · 배준수

세미 조인 최적화

책너두 6기 32일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.329 ~ p.343 내용정리 09 옵티마이저와 힌트 9.3 고급 최적화 9.3.1 옵티마이저 스위치 옵션 9.3.1.5 인덱스 머지(index_merge) 인덱스를 이용해 쿼리를 실행할 경우 테이블별로 하나의 인덱스만 사용하지 않고 2개 이상의 인덱스를 이용해 쿼리를 처리하는 옵션 9.3.1.6 인덱스 머지 -교집합(index_merge_intersection) 쿼리가 2개의 where 조건을 가질 때 각각의 인덱스 키를 모두 사용하여 쿼리를 처리하는 것. 결과를 교집합만 반환한다. 9.3.1.7 인덱스 머지-합집합(index_merge_union) 교집합과 달리 OR 연산자를 사용하는 것. 합집합을 반환한다. 우선순위 큐를 이용하여 중복된 레코드들을 정렬 없이 걸러낸다. ...

2023년 10월 17일 · 2 분 · 배준수

고급 최적화

책너두 6기 31일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.318 ~ p.328 내용정리 09 고급 최적화 9.3 고급 최적화 MySQL 서버의 옵티마이저가 실행 계획을 수립할 때 통계 정보와 옵티마이저 옵션을 결합해서 계획을 수립한다. 옵션은 크게 조인 관련된 옵션과 스위치로 구분할 수 있다. 9.3.1 옵티마이저 스위치 옵션 옵티마이저 스위치 옵션은 optimizer_switch시스템 변수를 이용해 제어한다. 9.3.1.1 MRR과 배치 키 엑세스(mrr & batched_key_access) MMR은 “Multi-Range Read"를 줄여서 부르는 이름인데, 메뉴얼에서는 DS-MRR(Disk Sweep Multi-Range Read)이라고도 한다. 네스티드 루프 조인(Nested Loop Join)은 드라이빙 테이블(조인에서 제일 먼저 읽는 테이블들)의 일치하는 레코드를 찾아서 조인을 수행하는 것이다. 이와 달리 드라이빙 테이블의 레코드를 읽어서 드리븐 테이블과의 조인을 즉시 실행하지 않고 조인 대상을 버퍼링한다. 조인 버퍼에 레코드가 가득 차면 비로소 MySQL 엔진은 버퍼링된 레코드를 스토리지 엔진으로 한 번에 요청한다. 이 읽기 방식을 MRR이라고 하고, 응용하여 실행되는 조인 방식을 BKA(Batched Key Access) 조인이라고 한다. ...

2023년 10월 16일 · 2 분 · 배준수

내부 임시 테이블

책너두 6기 30일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.308 ~ p.317 내용정리 09 옵티마이저와 힌트 9.2.5 distinct 처리 특정 칼럼의 유니크한 값만 조회하려면 select 쿼리에 distinct를 사용한다. 각 경우에 distinct 키워드가 영향을 미치는 범위가 달라지는 경우를 살펴보자. 집하 함수와 함께 사용되는 경우와 없는 경우이다. 9.2.5.1 select distinct … select되는 레코드 중에서 유니크한 레코드만 가져오려면 select distinct 형태의 쿼리 문장을 사용한다. distinct 키워드는 조회되는 모든 칼럼에 영향을 미친다. select하는 여러 칼럼 중에서 일부 칼럼만 유니크하게 조회하는 것은 아니다 ...

2023년 10월 14일 · 2 분 · 배준수

정렬 처리 방법의 성능 비교

책너두 6기 29일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.299 ~ p.308 내용정리 09 옵티마이저와 힌트 9.2.3.3.3 임시 테이블을 이용한 정렬 2개 이상의 테이블을 조인해서 그 결과를 정렬해야 한다면 임시 테이블이 필요할 수 있다. 이 방법은 3가지 정렬의 방법 중 가장 느리다. 9.2.3.3.4 정렬 처리 방법의 성능 비교 퀄에서 인덱스를 사용하지 못하는 정렬이나 그루핑 작업이 왜 느리게 작동할 수 밖에 없는지 한번 살펴보자. 쿼리가 처리되는 방법을 스트리밍 처리와 버퍼링 처리 2가지로 구분했다. ...

2023년 10월 13일 · 3 분 · 배준수

MysQL에서 정렬

책너두 6기 28일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.287 ~ p.298 내용정리 09 옵티마이저와 힌트 9.2.2 병럴 처리 병렬 처리는 하나의 쿼리를 여러 스레드가 작업을 나누어 동시에 처리하는 것을 의미한다. innodb_parallel_read_threads라는 시스템 변수로 스레드 갯수를 설정할 수 있다. where 조건 없이 단순히 테이블의 전체 건수를 가져오는 쿼리만 병렬로 처리할 수있다. CPU 갯수를 넘어서면 오히려 성능이 떨어질 수 있다. 9.2.3 ORDER BY 처리(Using filesort) 인덱스 이용 장점 : insert, update, delete 쿼리가 실행될 때 이미 인덱스가 정렬돼 있어서 빠르다 단점 : insert, update, delete 작업 시 부가적인 인덱스 추가/삭제 작업이 필요해 느리다. 디스크 공간이 더 필요하다. FIlesort 이용 ...

2023년 10월 12일 · 2 분 · 배준수

옵티마이저

책너두 6기 27일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.277 ~ p.286 내용정리 08 인덱스 8.9 유니크 인덱스 유니크는 인덱스라기보다는 제약 조건에 가깝다고 볼 수 있다. 테이블이나 인덱스에 같은 값이 2개 이상 저장될 수 없다는 의미이다. MySQL에서는 인덱스 없이 유니크 제약만 설정할 방법이 없다. NULL은 특정 값이 아니므로 2개 이상 저장될 수 있다. 8.9.1 유니크 인덱스와 일반 세컨더리 인덱스의 비교 유니크 인덱스와 유니크하지 않은 일반 세컨더리 인덱스는 사실 인덱스의 구조상 아무 차이가 없다 ...

2023년 10월 11일 · 3 분 · 배준수