728x90
반응형
참고
https://nomadlee.com/mysql-explain-sql/
https://cheese10yun.github.io/mysql-explian/
MYSQL Explain
사용해야 하는 이유
- 쿼리 실행문에 대한 정보를 알 수 있다. 예를 들면, select 쿼리를 실행했을 때 몇개의 row가 검색되는지, 어떤 테이블과 조인하는지에 대한 정보들
- 튜닝에서 가장 중요한 것은 쿼리와 스키마 최적화이다.
- 스키마 : 데이터베이스의 구조와 제약조건에 관해 전반적인 명세를 기술한 것
- 개체(Entity)의 속성(Attribute)의 관계(Relation)에 대한 정의와 이들을 유지해야 할 제약조건들을 기술한 것
- 스키마 : 데이터베이스의 구조와 제약조건에 관해 전반적인 명세를 기술한 것
- Slow Query를 없애는 것이 성능 향상에 도움이 된다.
- 스키마는 한 번 정해지면 수정하기 쉽지 않으므로, 쿼리 최적화를 통해 성능을 향상시키는 것이 좋다.
- MySQL Explain
- DB가 데이터를 찾아가는 일련의 과정을 사람이 알아보기 쉽게 DB 결과 셋으로 보여주는 것이다.
- 기존의 쿼리 튜닝, 성능 분석,인덱스 전략 수립 등과 같이 성능 최적화에 대한 전반적인 업무를 처리할 수 있다.
- 실행 계획이 무엇인지 알고 싶을 때 사용하는 기본적인 명령어
- 5.6부터는 JSON 형식 출력 가능
- MySQL Explain 항목 별 의미
구분설명
id | select 아이디로 구분하는 번호 |
table | 참조하는 테이블 |
select_type | select에 대한 타입 |
type | 조인 혹은 조회 타입. 접근방식을 표시하는 필드 - 어떻게 행데이터를 가져올 것인가를 가리킨다. |
possible_keys | 데이터를 조회할 때 DB에서 사용할 수 있는 인덱스 리스트 |
key | 실제로 사용할 인덱스 |
key_len | 실제로 사용할 인덱스의 길이 |
ref | Key 안의 인덱스와 비교하는 컬럼(상수). 테이블에서 열을 선택하기 위해 key 컬럼 안에 명명되어 있는 인덱스를 어떤 컬럼 또는 Constant(상수)와 비교하는지 보여준다. |
rows | 쿼리 실행 시 조사하는 행 수립 |
extra | 추가 정보. MySQL이 쿼리를 어떻게 해석하는지에 관한 추가적인 정보 제공 |
- select_type : select에 대한 타입
- SIMPLE : 단순 SELECT
- PRIMARY : Sub Query를 사용할 경우 Sub Query의 외부에 있는 쿼리(첫 번째 쿼리) UNION을 사용할 경우 UNION의 첫 번째 쿼리
- UNION : UNION 쿼리에서 서 Primary를 제외한 나머지 SELECT
- DEPENDENT_UNION : UNION과 동일하나, 외부쿼리에 의존적임 (값을 공급받음)
- UNION_RESULT : UNION 쿼리의 결과물
- SUBQUERY : Sub Query를 구성하는 여러 쿼리 중 첫 번째 SELECT문
- DEPENDENT_SUBQUERY : Sub Query와 동일하지만, 외곽 쿼리에 의존적이디ㅏ.
- DERIVED : SELECT로 추출된 테이블
- UNCACHEABLE SUBQUERY
- UNCACHEABLE UNION
- type : 조인 혹은 조회 타입. 접근방식을 표시하는 필드 - 어떻게 행데이터를 가져올 것인가를 가리킨다.
- system : 테이블에 단 한개의 데이터만 있는 경우
- const : SELECT에서 Primary Key를 실수로 조회하는 경우로, 많아야 한 건의 데이터만 있다.
- eq_ref : 조인할 때 Primary Key
- ref : 조인할 때 Primary Key 혹은 Unique Key가 아닌 Key로 매칭한 경우
- ref_or_null : ref의 동작 + null이 추가되어 검색
- index_merge : 두 개의 인덱스가 병합되어 검색이 이루어지는 경우
- unique_subquery : 서브쿼리에서 Primary Key가 오는 경우 => SELECT * FROM table1 WHERE col1 IN (SELECT Primary Key FROM table1);
- index_subquery : unique_subquery와 비슷하지만, Primary Key가 아닌 인덱스인 경우 => SELECT * FROM table1 WHERE col1 IN (SELECT key1 FROM table1);
- range : 특정범위 내에서 인덱스를 사용하여 원하는 데이터를 추출하는 경우
- index : 인덱스를 처음부터 끝까지 찾아서 검색하는 경우, 일반적으로 인덱스 풀 스캔이라고 한다.
- all : 테이블을 처음부터 끝까지 검색하는 경우, 일반적으로 테이블 풀 스캔이라고 한다.
- Extra
- distinect: 조건을 만족하는 레코드를 찾았을 때 같은 조건을 만족하는 또 다른 레코드가 있는지 검사하지 않음
- not exist : left join조건을 만족하는 하나의 레코드를 찾았을 때 다른 레코드의 조합은 더 이상 검사하지 않는다.
- range checked for each record : 최적의 인덱스가 없는 차선의 인덱스를 사용한다.
- using filesort : mysql이 정렬을 빠르게 하기 위해 부가적인 일을 한다.
- using index : select 할 때 인덱스 파일만 사용
- using temporary : 임시 테이블을 사용한다. order by나 group by 할때 주로 사용
- where used : 조건(where)을 사용한다.
실습
- feed와 community를 모두 작성한 user의 feed id 값을 가져오는 예제
- feed 테이블과 community 테이블에서 user_id가 같은 경우를 INNER JOIN (교집합)으로 가져온다.
- SQL 쿼리 실행 - community, feed 확인
-- 테이블 확인
SELECT * FROM db.community;
SELECT * FROM db.feed;
- 위의 스크린샷을 보면, community와 feed를 모두 작성한 user는 5번 id를 가진 user 한 명이다.
- 따라서, inner join을 실행하면, 5번 user가 작성한 feed를 불러온다. (2개 => id는 8번과 25번)
SELECT f.id FROM db.community c INNER JOIN db.feed f ON c.user_id = f.user_id;
- EXPLAIN을 이용하여 정보를 출력한다.
EXPLAIN SELECT * FROM db.community c INNER JOIN db.feed f ON c.user_id = f.user_id;
- select_type : SIMPLE - 단순히 Select를 이용했기 때문에 SIMPLE이 출력된다.
- type : 조인 혹은 조회 타입. 접근방식을 표시하는 필드 - 어떻게 행데이터를 가져올 것인가를 가리킨다.
- index : 인덱스를 처음부터 끝까지 찾아서 검색하는 경우, 일반적으로 인덱스 풀 스캔이라고 한다.
- feed 테이블(f)에서 id 값을 가져와야 하므로 index를 이용한 풀 스캔이 사용된다.
- ref : 조인할 때 Primary Key 혹은 Unique Key가 아닌 Key로 매칭한 경우
- join을 Primary Key(commuinity_id) 혹은 Unique Key가 아닌 user_id를 key로 사용했다.
- index : 인덱스를 처음부터 끝까지 찾아서 검색하는 경우, 일반적으로 인덱스 풀 스캔이라고 한다.
- ref : Key 안의 인덱스와 비교하는 컬럼(상수). 테이블에서 열을 선택하기 위해 key 컬럼 안에 명명되어 있는 인덱스를 어떤 컬럼 또는 Constant(상수)와 비교하는지 보여준다.
- community 테이블(c)은 feed테이블의 user_id의 컬럼과 비교한다.
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
반응형
'데이터베이스 > MySQL' 카테고리의 다른 글
MySQL Export 'column_statistics' 에러 해결 (0) | 2023.04.27 |
---|