2013-10-17 64 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。