MySQL没有使用索引

时间:2011-02-02 09:31:59

标签: mysql indexing

我有下表

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;

它充满了大约800k行的测试数据。每当我运行以下查询时,大约需要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 = ?,也应该从中受益。

3 个答案:

答案 0 :(得分:2)

我遇到一个问题,一个查询不使用我指定的索引。事实证明,如果(查询的)结果超过某些行,MySQL将不会使用您的索引。例如,如果结果本身占用了大量的总行,则不会使用您的索引。但是,我没有具体的百分比。你可以尝试调整查询以返回较小的结果来测试这个理论。

我对此问题的疑问:MySQL datetime index is not working

答案 1 :(得分:1)

对于800,000行,

0.4s也不错。 MySQL优化器可能会确定它不需要您的索引。

您可以尝试使用“提示”来查看是否可以更改效果结果:

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

答案 2 :(得分:0)

接受的答案实际上是正确的,但如果您希望MySQL使用索引而不管匹配行,您可以指定FORCE INDEX(index_name)命令。