2011-10-11 4 views
1
내가 EXPLAIN과 재생이 간단한 쿼리를 실행했다

:MySQL은 -이 쿼리가 인덱스를 사용하지 않는 이유 (설명에 따라)

EXPLAIN SELECT * FROM actions WHERE user_id = 17; 

그리고 확실히이 출력보고 놀라게했다 :

select_type SIMPLE 
table   actions 
type   ALL 
possible_keys user_id 
key   null 
key_len  null 
ref   null 
rows   6 
extra   Using where 

내 이해는 색인이 조회에 사용되지 않는다는 것을 의미합니다. 맞습니까?

CREATE TABLE `actions` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id` int(10) unsigned NOT NULL, 
    ... 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1 

왜이 키 값을 사용하지 않는 것 :

이 테이블 정의 (inpart)입니다 (단 6 행이 시간에 테이블에 총이 있지만 더 많은있을 것입니다) user_id에?

+0

인덱스가 현재 사용되지 않는다는 사실은 향후 인덱스가 사용되지 않는다는 것을 의미하지 않습니다. – Karolis

+1

아마도이 경우 6 행을 스캔하는 것이 더 빠를 것입니다. 수백 개의 행을 추가하면 어떨까요? –

+0

@Karolis는별로 의미가 없습니다. 기본 키에 대한 쿼리는 6 개의 행이있는 경우에도 해당 인덱스를 사용합니다. – Will

답변

5

때로는 MySQL이 인덱스를 사용할 수있는 경우에도 인덱스를 사용하지 않는 경우가 있습니다. 이것은 테이블을 직접 읽는 것보다 탐색이 적을 때입니다. 6 행으로이 상황에 처해있는 것 같습니다.

좀 더 현실적인 데이터 세트를 사용할 때 주기적으로 OPTIMIZE TABLEANALYZE TABLE을 실행해야합니다.

옵티 마이저보다 더 잘 할 수 있다고 생각한다면 Index Hint Syntax을 사용할 수 있습니다.

+0

Note : InnoDB 테이블에는 analyze 테이블이 필요 없다. – Karolis

관련 문제