2011-02-02 43 views
0

我有如下表的MySQL不使用索引

CREATE TABLE `Config` (
    `id` mediumint(9) NOT NULL AUTO_INCREMENT, 
    `type_id` mediumint(9) DEFAULT NULL, 
    `content_id` mediumint(9) DEFAULT NULL, 
    `menu_id` int(11) DEFAULT NULL, 
    `field` varchar(50) NOT NULL DEFAULT '', 
    `value` text NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `menu_id` (`menu_id`) USING BTREE, 
    KEY `type_id` (`type_id`,`content_id`,`menu_id`) USING BTREE 
) ENGINE=MyISAM AUTO_INCREMENT=1; 

它充满了大约80万行的测试数据。每当我运行下面的查询需要花费约0.4秒即可完成:

SELECT id, content_id, menu_id, field, `value` 
FROM Config 
WHERE type_id = ? 
AND content_id = ? 

的解释告诉我,MySQL是做一个全表,而不是使用索引:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  Config ALL     792674 Using where 

可有人请解释什么我在这里做错了?该指数如何在这里使用?有时候,查询有额外的条件AND menu_id = ?,这也应该从中受益。

回答

2

我有一个查询它不使用我指定的索引,一旦出现了问题。事实证明,如果查询结果超过特定行,MySQL将不会使用您的索引。举个例子,如果结果本身占用了大量的总行数,它将不会使用你的索引。但是,我没有具体的百分比。你可以尝试调整查询来返回更小的结果来测试这个理论。

我对这个问题的问题:MySQL datetime index is not working

+0

这似乎也是这种情况 - 有太多的行具有相同的值,所以MySQL决定表扫描在这里会更好。感谢提示! – acme 2011-02-02 13:22:11

1

0.4s对800,000行不坏。 MySQL优化器可能会确定它不需要您的索引。

你可以尝试使用“提示”,看看你是否可以改变业绩成果:

http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

+0

谢谢!太多的行在索引字段中具有相同的值,因此MySQL决定改为执行表扫描。 – acme 2011-02-02 13:22:51

0

接受的答案是正确的实际,但如果你想你的MySQL使用索引,无论比赛行,你可以指定FORCE INDEX(index_name)命令。