MySQL에서 HINT를 사용해서 인덱스를 활용하기 (실행계획 explain 설명도 함께~)

|



MySQL에서 Index를 설정할 경우, 오라클처럼 Hint를 활용해서 사용자가 지정하는 Index를 실행하도록 구성할 수 있습니다. 

인덱스를 잘 설정하려면 사용할 쿼리에 대한 실행계획을 볼 줄 알아야 합니다.

MySQL에서 실행계획을 살펴보는 명령어는 explain 입니다.

> explain
> select ~~

이런 형태로 사용하면 쿼리 결과가 아니라 다음과 같은 실행 계획이라는 것이 나타납니다.  

+----+-------------+----------------+------+---------------+------+---------+------+------+-------+
| id | select_type | table          | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+----------------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | character_sets | ALL  | NULL          | NULL | NULL    | NULL | NULL |       |
+----+-------------+----------------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)

해당 정보에 대해서는 다음 사이트에 보면 한글로 잘 정리해 놓았으니 참고하시기 바랍니다. 
오늘 정리할 내용은 explain이 아니므로 http://blog.wowpc.net/30 을 참고하세요~~

자~ 그럼 인덱스 사용과 관련된 내용을 정리해 보겠습니다.

먼저 현재 테이블에 설정된 인덱스는 다음과 같은 명령어로 살펴볼 수 있습니다. 

> SHOW INDEX FROM 테이블명

mysql> show index from tb_member;
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table     | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| tb_member |          0 | PRIMARY  |            1 | uid         | A         |           1 |     NULL | NULL   |      | BTREE      |         |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
1 row in set (0.01 sec)

각 항목을 간단히 살펴보면 다음과 같습니다. 
Non_unique: 0 - Unique / 1 - Not Unique
Key_name: 인덱스 이름
Column_name: 부과된 칼럼명
Collation: A - ASC / D - DESC / NULL - 정렬 안함.

explain으로 실행계획을 살펴봤을 때, 쿼리와 관계없는 인덱스를 사용하고 있으면 
USE INDEX, FORCE INDEX, IGNORE INDEX를 사용해서 강제적으로 사용할 인덱스를 지정할 수 있습니다.
또한 FOR ORDER BY, FOR GROUP BY를 이용하여 정렬이나 그룹 지정에 필요한 인덱스도 지정할 수 있습니다.

다시 정리하면 다음과 같습니다. 

USE INDEX (인덱스명)
IGNORE INDEX (인덱스명)
FORCE INDEX (인덱스명)

USE INDEX FOR ORDER BY (인덱스명)
USE INDEX FOR GROUP BY (인덱스명)


예를 들어보면 다음과 같이 사용하실 수 있습니다. 

> SELECT * FROM 테이블명 IGNORE INDEX (인덱스명1, 인덱스명2) WHERE 조건절;
> SELECT * FROM 테이블명 USE INDEX FOR ORDER BY (인덱스명3);

그런데 제가 테스트 해보니 DESC로 지정된 ORDER BY 인덱스가 계속 안되는 겁니다. 살펴보니 다음과 같았습니다. 

An index_col_name specification can end with ASC or DESC. These keywords are allowed for future extensions for specifying ascending or descending index value storage. Currently, they are parsed but ignored; index values are always stored in ascending order.

헐.. 현재는 인덱스에서 DESC 관련 지원이 안되는가 봅니다. 

이와 관련해서 해당 필드에 -1을 곱해서 ASC로 처리할 수 있다는 글들도 있던데.. 
그렇게까지 하면서 인덱스 정렬을 해야 할까 하는 생각이 들어서~
MySQL에서는 DESC 필드에 대한 인덱스를 통한 정렬을 안하기로 했네요.. 

참고하시기 바랍니다. 

 



Trackback 0 And Comment 0