삽질의 현장/- DataBase

[삽잡이::sql] 내가 작성한 Query는 어떻게 실행되려나... EXPLAIN !

shovelman 2016. 6. 13. 23:04



 EXPLAIN is used to obtain a query execution plan 

(that is, an explanation of how MySQL would execute a query).

(출처_ MySQL)


EXPLAIN은 쿼리 실행에 대한 계획을 알고 싶을 때 사용합니다.

우와 삽잡이~~ 영어좀 하는데~~~  


하하하... 혼자놀기...


어떻게 DB가 실행될지 

즉, 어떻게 Data를 가져올지에 대한 

실행 계획을 확인할 수 있다는 것입니다.


MySQL에서는 쿼리 옵티마이저(Optimizer)를 통해 

빠르고 효율적으로 수행할 Query를 만들기 위해 최적화 작업을 시행합니다.

이에 잘 구조화 된 SQL Query를 작성하여 

Query문 변경 없이 잘! 사용하면 

DBMS의 내부 엔진에 있는 옵티마이저가 

처리 경로를 캐싱하여 최적화 된 과정으로 실행시켜줍니다.



(출처_ ORACLE)

Oracle 사이트에서 가져왔지만, 

그림으로 잘 설명해주고 있네요!


사용법은 간단합니다.

SELECT 문 앞에 EXPLAIN 키워드를 붙여주면 됩니다.


1
EXPAIN SELECT test_idx, test_name, test_url, success, total, fail FROM test_table
cs


그러면, SELECT가 어떻게 실행될지에 대한 처리 방법을 보여줍니다.



'index를 타는가 확인해보라' 이런 말을 듣게 되신다면,

이는 테이블의 어느 곳에 index를 추가하면 

열을 더 빨리 찾게 되는지 알고 

Query문을 작성하는데 참고할 수 있을 것입니다.


위의 EXPLAIN을 통해 얻은 값을 쪼금식 살펴봅시다.


쫄지마~~ 



select_type은 말 그대로 SELECT 문의 종류를 의미합니다.

SIMPLE이냐, 

Sub Query를 가지고 있는 Main Query냐, 

Sub Query냐 등등으로 말입니다.


table은 말 그대로 table 명을 말합니다. alias일 수도 있겠지요.


possible_key를 보게되면 

MySQL 옵티마이저가 Index가 타는지 확인할 수 있습니다.

쿼리 처리를 위해 key로 사용할 index 후보들을 나타내고 있는 것이지요.


이어서 key에 값이 있다면 

옵티마이저가 key값으로 index를 사용했다는 사실을 알 수 있습니다. 


Index를 사용할 수 있다는 자체로만으로도 

빠른 Query 실행을 기대할 수 있습니다.


Extra는 

옵티마이저가 쿼리를 해석한 추가적인 정보들을 나타내줍니다.

삽잡이의 예제에 있는 EXPLAIN 값을 보면

쿼리 처리를 위해서 임시 테이블을 생성했고,

filesort를 사용했다는 사실을 알 수 있습니다.


제가 예시를 통해 보여드린 Query는 

Using filesort, Using temporary 가 있지요?

Query가 느릴 수 밖에 없습니다.... 


만약, index를 사용하지 않는다면....

더 느려지겠지요....


사용자들이 실제 사용하는 서비스에 저런 Query가 들어가면

데이터를 받아오느라 로딩이 오래 걸리겠지요?


그러면 문제가 되겠지요...


뭐 예를들어 그렇다 이겁니다.

하하...


EXPAIN을 통해 추출된 Table의 정보는 

아래의 사이트에 잘 나와있으니 확인해보시길 바랍니다~!


EXPLAIN Table 정보 확인


Code도 이쁘게 Query도 이쁘게 작성하자구요~!


굳~