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 초가 걸립니다.
varchar의 색인에서 하위 카디널리티가 –
입니다. SELECT * FROM eventHistory where whoID = '12551'을 사용해보십시오. [데모] (http://sqlfiddle.com/#!2/4898d/5). –
두 조언 모두 매우 유용합니다. 컬럼의 정수를 사용하기 위해 테이블의 로컬 복사본을 변환 했으므로 쿼리가 즉시 실행됩니다. 쿼리 조건에 따옴표를 추가하면 동일한 결과가 도출됩니다. 매우 감사합니다! – tmountain