mySQL estimate cost, 최적화

broccoli·2021년 6월 16일
0

mysql

목록 보기
5/6

사용방법

explain tbl_name

--or

explain [extended] select select_options
--예
explain format=json select select_options

table에 사용하는 경우 describe tbl_name or show columns tbl_name과 동일하다.

select절에 사용하는 경우 쿼리실행플랜정보를 최적화해서 가져온다. select 명령문에 테이블순서와 상응하게 조인순서를 사용하기위해서는 select만을 사용하는 대신에 select straight_join을 사용해서 시작한다.

사용예제 및 결과

explain select * from <테이블명> where <조건>

1. 결과

idselect_typetabletypepossible_keyskeykey_lenrefrowsextra
1SIMPLEtable_namerefidx_table_sri,idx_table_list_order,...idx_table_status8const34

2. 결과설명

옵션설명
table결과 열이 참조하는 테이블
type조인 (join) 타입. 서로 다른 타입의 조인 (join)이 아래에 있는데, 가장 좋은 것부터 가장 나쁜 것의 순서로 되어 있다.
- system : 테이블이 하나의 레코드만 가지는 경우
- const : 테이블에 조건을 만족하는 레코드가 하나일 때, 상수 취급
- eq_ref : 인덱스가 UNIQUE이거나 PRIMARY KEY인 경우의 조인으로 const를 제외한 조인 중 가장 좋은 형태
- ref : eq_ref와 다른 점은 UNIQUE가 아닐 경우 사용한다는 것.
- range : 조건에 레코드의 범위가 주어진 조인.
- index : all 형태와 비슷하며, 인덱스를 사용한다.
- all : 모든 레코드를 스캔한다.
possible_keys컬럼은 이 테이블에서 열을 찾기 위해 MySQL이 선택한 인덱스를 가리킨다.
이 컬럼은 EXPLAIN 결과에서 나타나는 테이블 순서와는 전적으로 별개의 순서가 된다..
이것은, possible_keys에 있는 키 중에 어떤 것들은 테이블 순서를 만드는 과정에서는 사용되지 않을 수도 있음을 의미하는 것이다..
만일 이 컬럼 값이 NULL이라면, 연관된 인덱스가 존재하지 않게 된다..
이와 같은 경우, 여러분은 WHERE 구문을 검사해서, 이 구문이 인덱스 하기에 적당한 컬럼을 참조하고 있는지 여부를 알아 봄으로써 쿼리 속도를 개선 시킬 수가 있게 된다..
그러한 경우라면, 적절한 인덱스를 하나 생성한 후에, EXPLAIN을 다시 사용해서 쿼리를 검사한다. 테이블이 어떤 인덱스를 가지고 있는지를 보기 위해서는, SHOW INDEX FROM tbl_name를 사용한다.
keypossible_keys에 나온 키 중에서 실제로 사용한 키 MySQL이 실제로 사용할 예정인 키 (인덱스)를 가리킨다..
만일 아무런 인덱스도 선택되지 않았다면, 그 키는 NULL이 된다. MySQL로 하여금 possible_keys 컬럼에 있는 인덱스를 사용하거나 또는 무시하도록 만들기 위해서, FORCE INDEX, USE INDEX, 또는 IGNORE INDEX를 쿼리에서 사용하도록 한다..
MyISAM 및 BDB 테이블의 경우에는, ANALYZE TABLE를 구동시키면 옵티마이저가 보다 좋은 인덱스를 선택하도록 도움을 줄 수가 있다..
MyISAM 테이블의 경우에는, myisamchk --analyze 가 동일한 역할을 한다.
key_lenMySQL이 사용하기로 결정한 키의 길이를 나타낸다.
만일 key 컬럼이 NULL이라면, 이 값도 NULL이 된다.
key_len 값은 다중-부분 (multiple-part) 키 중에 얼마나 많은 부분을 MySQL이 실제로 사용하는지를 여러분이 알 수 있도록 해 준다.
ref테이블에서 열을 선택하기 위해 key 컬럼 안에 명명되어 있는 인덱스를 어떤 컬럼 또는 상수(constant)와 비교하는지를 보여준다.
rowsMySQL이 쿼리를 실행하기 위해 조사해야 하는 열의 숫자를 가리킨다
extraMySQL이 쿼리를 어떻게 해석하는지에 관한 추가적인 정보를 제공한다.
- distinct : 조건을 만족하는 레코드를 찾았을 때 같은 조건을 만족하는 또 다른 레코드가 있는지 검사하지 않음.
- not exist : left join 조건을 만족하는 하나의 레코드를 찾았을 때 다른 레코드의 조합은 더 이상 검사하지 않는다.
- range checked for each record : 최적의 인덱스가 없는 차선의 인덱스를 사용한다는 의미.
- using filesort : mysql이 정렬을 빠르게 하기 위해 부가적인 일을 한다.
- using index : select 할때 인덱스 파일만 사용
- using temporary : 임시 테이블을 사용한다. order by 나 group by 할때 주로 사용
- where used : 조건을 사용한다는 의미.

참조링크

profile
🌃브로콜리한 개발자🌟

0개의 댓글