Extra
칼럼에 자주 표시된다.Extra
칼럼에는 고정된 몇 개의 문장이 표시된다.여기서 설명하는 순서는 성능과는 무관하다.
const
접근 방법으로 테이블을 읽었지만 실제로 해당 테이블에 레코드가 1건도 존재하지 않을 경우 표시된다.TRUNCATE TABLE
명령을 사용할 것을 권장한다.FirstMatch
메시지에 기준 테이블 명이 함께 표시된다.FirstMatch(테이블명)
col1 IN (SELECT col2 FROM ...)
과 같은 조건을 가진 쿼리에서 자주 발생한다.Full scan on NULL key
는 MySQL 서버가 쿼리를 실행하는 중 col1
이 NULL을 만나면 차선책으로 서브쿼리 테이블에 대해서 풀 테이블 스캔을 사용할 것이라는 사실을 알려주는 키워드이다.col1
이 NOT NULL로 정의되었다면 이러한 차선책은 사용되지 않는다.IN
이나 NOT IN
연산자의 왼쪽에 있는 값이 실제로 NULL이 없다면 풀 테이블 스캔은 발생하지 않으므로 걱정하지 않아도 된다.NOT IN(subquery)
형태나 NOT EXISTS
연산자를 사용하는데, 레코드의 건수가 많을 때는 아우터 조인을 이용하면 빠른 성능을 낼 수 있다.## 실행 중인 쿼리 보기 (커넥션ID 확인)
SHOW PROCESSLIST;
## 특정 커넥션의 실행 계획 확인하기
EXPLAIN FOR CONNECTION 커넥션ID;
EXPLAIN FOR CONNECTION
명령이 실행되었을 경우 이 문구가 표시된다.EXPLAIN FOR CONNECTION
명령을 실행하면 된다.EXPLAIN
SELECT *
FROM employees e1, employees e2
WHERE e1.emo_no >= e2.emp_no
(index map: 0x1)
과 같은 메시지가 함께 출력되는데, 이는 사용할지 말지를 판단하는 후보 인덱스의 순번을 나타낸다.16진수로 표시되므로 이진수로 표현을 바꿔서 해석해야 한다.
0x1이 표시되었다면 이진수로도 1이므로, 테이블의 첫 번째 인덱스를 사용할지 아니면 테이블을 풀 스캔할지를 매 레코드 단위로 결정하면서 처리된다.
## index map의 16진수를 이진수로 변환했을 때 각 자릿수는
## 다음 명령으로 테이블의 구조를 조회 시 나열된 인덱스의 순번을 의미한다.
SHOW CREATE TABLE 테이블명;
각 자릿수의 값이 1인 인덱스를 사용 가능한 인덱스 후보로 선정했음을 의미한다. (여러 후보 인덱스들 중 어떤 것을 사용했는지는 알 수 없다)
type
칼럼의 값은 ALL
로 표시된다.MySQL 서버에서 재귀 쿼리는 WITH
구문을 이용해 CTE를 사용하면 된다.
## n이라는 칼럼 하나를 가진 cte라는 이름의 내부 임시 테이블을 생성
WITH RECURSIVE cte (n) AS
(
## n 칼럼의 값이 1부터 5까지 1씩 증가하게 해서 레코드 5건을 만든다
SELECT 1
UNION
SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;
WITH
구문이 재귀 CTE로 사용되었을 경우 Recursive
메시지가 표시된다.Rematerializing
이라고 한다.Start temporary
표시End temporary
표시