티스토리 뷰
MySQL에서 Index를 설정할 경우, 오라클처럼 Hint를 활용해서 사용자가 지정하는 Index를 실행하도록 구성할 수 있습니다.
인덱스를 잘 설정하려면 사용할 쿼리에 대한 실행계획을 볼 줄 알아야 합니다.
MySQL에서 실행계획을 살펴보는 명령어는 explain 입니다.
> explain
> select ~~
이런 형태로 사용하면 쿼리 결과가 아니라 다음과 같은 실행 계획이라는 것이 나타납니다.
해당 정보에 대해서는 다음 사이트에 보면 한글로 잘 정리해 놓았으니 참고하시기 바랍니다.
오늘 정리할 내용은 explain이 아니므로 http://blog.wowpc.net/30 을 참고하세요~~
자~ 그럼 인덱스 사용과 관련된 내용을 정리해 보겠습니다.
먼저 현재 테이블에 설정된 인덱스는 다음과 같은 명령어로 살펴볼 수 있습니다.
> SHOW INDEX FROM 테이블명
또한 FOR ORDER BY, FOR GROUP BY를 이용하여 정렬이나 그룹 지정에 필요한 인덱스도 지정할 수 있습니다.
다시 정리하면 다음과 같습니다.
예를 들어보면 다음과 같이 사용하실 수 있습니다.
> SELECT * FROM 테이블명 IGNORE INDEX (인덱스명1, 인덱스명2) WHERE 조건절;
> SELECT * FROM 테이블명 USE INDEX FOR ORDER BY (인덱스명3);
그런데 제가 테스트 해보니 DESC로 지정된 ORDER BY 인덱스가 계속 안되는 겁니다. 살펴보니 다음과 같았습니다.
헐.. 현재는 인덱스에서 DESC 관련 지원이 안되는가 봅니다.
이와 관련해서 해당 필드에 -1을 곱해서 ASC로 처리할 수 있다는 글들도 있던데..
그렇게까지 하면서 인덱스 정렬을 해야 할까 하는 생각이 들어서~
MySQL에서는 DESC 필드에 대한 인덱스를 통한 정렬을 안하기로 했네요..
참고하시기 바랍니다.
인덱스를 잘 설정하려면 사용할 쿼리에 대한 실행계획을 볼 줄 알아야 합니다.
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)
각 항목을 간단히 살펴보면 다음과 같습니다.
explain으로 실행계획을 살펴봤을 때, 쿼리와 관계없는 인덱스를 사용하고 있으면
USE INDEX, FORCE INDEX, IGNORE INDEX를 사용해서 강제적으로 사용할 인덱스를 지정할 수 있습니다. 각 항목을 간단히 살펴보면 다음과 같습니다.
Non_unique: 0 - Unique / 1 - Not Unique
Key_name: 인덱스 이름
Column_name: 부과된 칼럼명
Collation: A - ASC / D - DESC / NULL - 정렬 안함.
explain으로 실행계획을 살펴봤을 때, 쿼리와 관계없는 인덱스를 사용하고 있으면
또한 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.이와 관련해서 해당 필드에 -1을 곱해서 ASC로 처리할 수 있다는 글들도 있던데..
그렇게까지 하면서 인덱스 정렬을 해야 할까 하는 생각이 들어서~
MySQL에서는 DESC 필드에 대한 인덱스를 통한 정렬을 안하기로 했네요..
참고하시기 바랍니다.
'프로그래밍 > MySQL' 카테고리의 다른 글
MAC에서 MySQL 삭제하기 (0) | 2015.05.07 |
---|---|
MySQL Workbench에서 safe mode 처리 (0) | 2012.09.21 |
MySQL 세팅 정보 확인 명령어 (0) | 2011.11.21 |
MySQL 쿼리를 활용해 지도 위치간 거리 계산하기 (0) | 2011.11.08 |
MySQL 중지 및 시작하는 명령어 (0) | 2011.09.19 |
댓글