MySQL拒绝使用索引进行简单查询

时间:2013-10-17 18:13:59

标签: mysql sql database optimization indexing

我有一个表,我正在运行一个非常简单的查询。我在高基数列上添加了一个索引,因此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 个答案:

答案 0 :(得分:1)

上述答案让我意识到两件事。

1)当使用VARCHAR索引时,需要引用查询条件,否则MySQL将拒绝使用索引(隐式在幕后投射?)

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

2)如果可能的话,最好使用/索引INT。