책너두 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하는 여러 칼럼 중에서 일부 칼럼만 유니크하게 조회하는 것은 아니다

9.2.5.2 집합 함수와 함꼐 사용된 distinct

그 집합 함수의 인자로 전달된 칼럼값이 유니크한 것들을 가져온다.

9.2.6 내부 임시 테이블 활용

내부 임시 테이블(Internal temporary table)은 MySQL 엔진이 스토리지 엔진으로부터 받아온 레코드를 정렬하거나 그루핑할 때 사용한다. 이 임시 테이블은 crate temporary table명령으로 만든 것과는 다르다. 쿼리의 처리가 완료되면 자동으로 삭제되ㅕ 다른 세션이나 다른 쿼리에서는 보거나 사용할 수 없다.

9.2.6.1 메모리 임시 테이블과 디스크 임시 테이블

메모리용 임시 테이블을 memory와 temptable중 선택할 수 있고, 기본 값은 temptable이다. 최대 사용 가능 메모리 공간의 크기는 기본값이 1GB이다. MMAP 파일로 기록할지 InnoDB 테이블로 전환할지도 선택할 수 있다.

9.2.6.2 임시 테이블이 필요한 쿼리
  • order by와 group by에 명시된 칼럼이 다른 쿼리
  • order by나 group by에 명시된 칼럼이 조인의 순서상 첫 번째 테이블이 아닌 쿼리
  • distinct와 order by가 동시에 쿼리에 존재하는 경우 또는 distinct가 인덱스로 처리되지 못하는 쿼리
  • union이나 union distinct가 사용된 쿼리(select_type 칼럼이 union result인 경우)
  • 쿼리의 실행 계획에서 select_type이 derived인 쿼리
9.2.6.3 임시 테이블이 디스크에 생성되는 경우

내부 임시 테이블은 기본적으로 메모리상에 만들어지지만 다음 조건이 만족되면 메모리 임시 테이블을 사용할 수 없게 된다. 이 떄는 디스크 기반으 임시 테이블을 사용한다.

  • union이나 union all에서 selelct되는 칼럼중에서 길이가 512바이트 이상인 크기의 칼럼이 있는 경우
  • group by나 distinct 칼럼에서 512바이트 이상인 크기의 칼럼이 있는 경우
  • 메모리 임시 테이블의 크기가 tmp_table_size 또는 max_heap_table_size 시스템 변수보다 크거나 temptable_max_ram 시스템 변수 값보다 큰 경우
9.2.6.4 임시 테이블 관련 상태 변수

Using temporary가 실행 계획상에서 표시되면 임시 테이블을 사용했다는 사실을 알 수 있다. 하지만 메모리에 처리됐는지 디스크에 처리됐는지, 몇개가 사용됐는지는 알 수 없다.