[MySQL] mariaDB Query Plan 계획(실행계획)

성난호랑이 시니철 ㅣ 2024. 1. 8. 15:09

mysql(mariadb) 쿼리 처리 순서를 확인 할 수 있는 plan 기능을 제공합니다.

 

보통 쿼리 앞에 explain 만 붙이면 실행계획을 볼수있습니다.

EXPLAIN
SELECT * FROM 
MB_MEMBER_INFO A, MB_CHILD_INFO B
WHERE A.MEMBER_ID_SQ = B.MEMBER_ID_SQ

 

 

 

총 10개의 컬럼으로 구성되어있습니다.

1. id

   - SELECT 번호, 쿼리내의 SELECT 의 구분번호이다.

2. select_type

   - SELECT 의 타입, 다음과 같다.

3. table

  - 나타난 결과가 참조하는 테이블명.

4. type

속도와 아주 밀접한 항목이다. 위에서 아래로 좋은 순서입니다

  - 우수한 순서대로 뒤로갈수록 나쁜 조인형태이다.

system – const – eq_ref – ref – ref_or_null – index_mergy – unique_subquery – index_subquery – range – index – ALL

     > system

테이블에 단 하나의 행만 존재(시스템 테이블). const join 의 특수한 경우이다.

     > const
많아야 하나의 매치되는 행만 존재하는 경우. 하나의 행이기 때문에 각 컬럼값은 나머지 연산에서 상수로 간주되며, 처음 한번만 읽어들이면 되기 때문에 무지 빠르다.
     > eq_ref
조인수행을 위해 각 테이블에서 하나씩의 행만이 읽혀지는 형태. const 타입이외에 가장 훌륭한 조인타입니다.
    > ref
이전 테이블과의 조인에 사용될 매치되는 인덱스의 모든행이 이 테이블에서 읽혀진다. leftmost prefix 키만을 사용하거나 사용된 키가 PRIMARY KEY 나 UNIQUE 가 아닐때(즉 키값으로 단일행을 추출할수 없을때) 사용되는 조인.
만약 사용된 키가 적은수의 행과 매치될때 이것은 적절한 조인 타입니다.
   > ref_or_null
ref 와 같지만 NULL 값을 포함하는 행에대한 검색이 수반된다.
4.1.1 에서 새롭게 도입된 조인타입이며 서브쿼리 처리에서 대개 사용된다.
아래 예에서 MySQL 은 ref_table 처리에 ref_or_null 조인타입을 사용한다.

   > index_merge
인덱스 병합 최적화가 적용되는 조인 타입.
이 경우, key 컬럼은 사용된 인덱스의 리스트를 나타내며 key_len 컬럼은 사용된 인덱스중 가장 긴 key 명을 나타낸다.
For more information, see Section 7.2.6, “Index Merge Optimization”.
   > unique_subquery
이것은 아래와 같은 몇몇 IN 서브쿼리 처리에서 ref 타입대신 사용된다.
   > index_subquery
unique_subquery 와 마찬가지로 IN 서브쿼리를 대체한다. 그러나 이것은 아래와 같이 서브쿼리에서 non-unique 인덱스가 사용될때 동작한다.
   > range
인덱스를 사용하여 주어진 범위 내의 행들만 추출된다. key 컬럼은 사용된 인덱스를 나타내고 key_len 는 사용된 가장 긴 key 부분을 나타낸다.
ref 컬럼은 이 타입의 조인에서 NULL 이다.
range 타입은 키 컬럼이 상수와 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN 또는 IN 연산에 사용될때 적용된다.
   > index
이 타입은 인덱스가 스캔된다는걸 제외하면 ALL 과 같다. 일반적으로 인덱스 파일이 데이타파일보다 작기 때문에 ALL 보다는 빠르다.
MySQL 은 쿼리에서 단일 인덱스의 일부분인 컬럼을 사용할때 이 조인타입을 적용한다.
   > ALL
이전 테이블과의 조인을 위해 풀스캔이 된다. 만약 (조인에 쓰인) 첫번째 테이블이 고정이 아니라면 비효율적이다, 그리고 대부분의 경우에 아주 느린 성능을 보인다. 보통 상수값이나 상수인 컬럼값으로 row를 추출하도록 인덱스를 추가함으로써 ALL 타입을 피할 수 있다.

 

5. possible_keys

  - MySQL 이 해당 테이블의 검색에 사용할수 있는 인덱스들을 나타낸다.

6. key

  - MySQL 이 실제 사용한 key(index) 를 나타낸다.

7. key_len

  - MySQL 이 사용한 인덱스의 길이를 나타낸다.

8. ref

  - 컬럼은 행을 추출하는데 키와 함께 사용된 컬럼이나 상수값을 나타낸다.

9. rows

  - 이 값은 쿼리 수행에서 MySQL 이 예상하는 검색해야할 행수를 나타낸다.

10. Extra

  - MySQL 이 쿼리를 해석한 추가적인 정보를 나타낸다.

 

- 4번 type 값을 보며 쿼리 및 인덱스를 수정 해서 사용하고있습니다.

 

참조 : https://database.sarang.net/?inc=read&aid=24199&criteria=mysql