mojh7 / real-mysql-study

:orange_book: Real MySQL 8.0 study
0 stars 0 forks source link

2022/09/26 ~ 2022/10/3 #23

Open mojh7 opened 1 year ago

mojh7 commented 1 year ago

다음 스터디

2022-10-03 pm 9:00 ~10:30~

학습 범위

정리 범위

danbi5228 commented 1 year ago

10.3.5.4 ref

10.3.5.5 fulltext

10.3.5.6 ref_or_null

mojh7 commented 1 year ago

10.3.5 type 칼럼

쿼리의 실행계획에서 type 이후의 칼럼은?

쿼리 튜닝할 때 인덱스를 효율적으로 사용하는지 확인하는 것이 중요하므로

type 칼럼은 반드시 체크해야 할 중요 정보


MySQL의 메뉴얼에서는 type 칼럼을 조인 타입으로 소개하고, 실제로 MySQL에서 하나의 테이블로부터 레코드를 읽는 작업도 조인처럼 처리한다

그래서 SELECT 쿼리의 테이블 개수에 관계없이 실행 계획의 type 칼럼을 조인 타입이라고 명시하고 있다

12개의 접근 방법 중 ALL을 제외한 나머지는 모두 인덱스를 이용한 접근 방법

ALL은 풀 테이블 스캔 접근 방법을 의미

하나의 단위 SELECT 쿼리는 위의 접근 방법 중에서 단 하나만 사용할 수 있다


10.3.5.1 system

레코드가 1건만 존재하는 테이블 또는 한 건도 존재하지 않는 테이블을 참조하는 형태의 접근 방법

MyISAM이나 MEMORY 테이블에서만 사용되는 접근 방법, InnoDB에서는 나타나지 않음


435p 예제 쿼리에서 레코드가 1건만 들어있는 테이블 SELECT하면

MyISAM 테이블일 때는 type 칼럼의 system이라고 나오고 InnoDB로 변환하고 결과를 보면 ALL로 나온다

ALL 또는 index로 표시될 가능성이 크다


10.3.5.2 const

테이블의 레코드 건수와 관계없이 쿼리가 PK나 Unique Key 칼럼을 이용하는 WHERE 조건절을 가지고 있으며,

반드시 1건을 반환하는 쿼리의 처리 방식

다른 DBMS에서는 이를 유니크 인덱스 스캔이라고도 표현


436p

다중 칼럼으로 구성된 PK나 유니크 키 중에서 인덱스의 일부 칼럼만 조건으로 사용할 때는 const 타입의 접근 방법을 사용할 수 없다

EXPLAIN
SELECT * FROM dept_emp WHERE dept_no='d005';

실제 레코드가 1건만 저장돼있더라도 직접 읽어보지 않고서는 1건이라고 확신할 수 없기 때문

PK의 일부만 조건으로 사용할 때는 type 칼럼의 const가 아닌 ref로 표시된다

437p

EXPLAIN
SELECT * FROM dept_emp WHERE dept_no='d005' AND emp_no=10001;

PK나 유니크 인덱스의 모든 칼럼을 동등 조건으로 WHERE 절에 명시하면 const 접근 방법을 사용한다


type 칼럼이 const인 실행 계획은 MySQL 옵티마이저가 쿼리를 최적화하는 단계에서 쿼리를 먼저 실행해서 통째로 상수화한다. 그래서 const로 표시되는 것 - 437~438p


10.3.5.3 eq_ref

여러 테이블이 조인되는 쿼리의 실행 계획에서만 표시

조인에서 처음 읽은 테이블의 칼럼값을, 그 다음 읽어야 할 테이블의 PK나 UK 칼럼의 검색 조건에 사용할 때를 가리켜 eq_ref라고 한다

두 번째 이후에 읽는 테이블의 type 칼럼에 eq_ref로 표시

두 번째 이후에 읽히는 테이블을 유니크 키로 검색할 때 그 유니크 인덱스는 NOT NULL이어야 한다

다중 칼럼으로 만들어진 PK나 UK라면 인덱스의 모든 칼럼이 비교 조건에 사용돼야만 eq_ref 접근 방법이 사용될 수 있다