2013-10-17 1 views
0

매우 간단한 쿼리를 실행하는 테이블이 있습니다. 상위 카디널리티 열의 테이블에 인덱스를 추가 했으므로 MySQL은 결과를 거의 즉시 좁힐 수 있어야하지만 매번 전체 테이블 스캔을 수행하고 있습니다. MySQL이 내 색인을 사용하는 이유는 무엇입니까?간단한 쿼리를 위해 인덱스 사용을 거부하는 MySQL

mysql> select count(*) FROM eventHistory; 
+----------+ 
| count(*) | 
+----------+ 
| 247514 | 
+----------+ 
1 row in set (0.15 sec) 

CREATE TABLE `eventHistory` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `whatID` varchar(255) DEFAULT NULL, 
    `whatType` varchar(255) DEFAULT NULL, 
    `whoID` varchar(255) DEFAULT NULL, 
    `createTimestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    KEY `whoID` (`whoID`,`whatID`) 
) ENGINE=InnoDB; 

mysql> explain SELECT * FROM eventHistory where whoID = 12551\G 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: eventHistory 
     type: ALL 
possible_keys: whoID 
      key: NULL 
     key_len: NULL 
      ref: NULL 
     rows: 254481 
     Extra: Using where 
1 row in set (0.00 sec) 

나는 FORCE INDEX를 쿼리에 추가하려고 시도했지만 여전히 전체 테이블 스캔을 수행하고있는 것처럼 보인다. 쿼리 성능도 좋지 않습니다. 현재 적절한 행을 찾기 위해 약 0.65 초가 걸립니다.

+1

varchar의 색인에서 하위 카디널리티가 –

+3

입니다. SELECT * FROM eventHistory where whoID = '12551'을 사용해보십시오. [데모] (http://sqlfiddle.com/#!2/4898d/5). –

+0

두 조언 모두 매우 유용합니다. 컬럼의 정수를 사용하기 위해 테이블의 로컬 복사본을 변환 했으므로 쿼리가 즉시 실행됩니다. 쿼리 조건에 따옴표를 추가하면 동일한 결과가 도출됩니다. 매우 감사합니다! – tmountain

답변

1

위의 답변을 통해 두 가지 사실을 깨닫게되었습니다.

1) VARCHAR 인덱스를 사용하는 경우, 쿼리 기준을 인용 할 필요가 또는 MySQL이

SELECT * FROM foo WHERE column = '123'; # do this 
SELECT * FROM foo where column = 123; # don't do this 

2) 사용 더 낫다)? 암시 무대 뒤에서 캐스팅 인덱스를 (사용을 거부합니다 가능한 경우 INT를 인덱싱합니다.

관련 문제