【问题标题】:MySQL is not using an indexMySQL 没有使用索引
【发布时间】:2011-06-19 20:26:23
【问题描述】:

我有下表

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 = ?,这也应该从中受益。

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!太多行在索引字段中具有相同的值,因此 MySQL 决定改为进行表扫描。
    【解决方案2】:

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

    我的问题:MySQL datetime index is not working

    【讨论】:

    • 这里似乎也是这种情况 - 具有相同值的行太多,因此 MySQL 决定在这里进行表扫描会更好。感谢您的提示!
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      相关资源
      最近更新 更多