【问题标题】:Query refuses to use index查询拒绝使用索引
【发布时间】:2012-12-11 20:01:21
【问题描述】:

使用 MySQL 5.5.28 版,

我有一个这样定义的表:

CREATE TABLE IF NOT EXISTS `groups` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(80) NOT NULL,
  `desc` text NOT NULL,
  `permissions` varchar(80) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 ;

如您所见,它非常简单。我在 id 字段上有一个主键。现在,我使用如下方式查询它:

SELECT permissions FROM groups WHERE id IN ('9', '8', '6','14','11','7','5');

不幸的是,它拒绝使用密钥,并显示在我的慢查询日志中。

对其执行 EXPLAIN 提供:

mysql> EXPLAIN SELECT permissions FROM groups WHERE id IN ('9', '8', '6','14','11','7','5');
+----+-------------+--------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | groups | ALL  | PRIMARY       | NULL | NULL    | NULL |   16 | Using where |
+----+-------------+--------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

它在整个表中只有不到 20 行,所以我明白为什么它不太可能使用索引。但是,为什么这会是 MySQL 的“慢查询”?

【问题讨论】:

  • 会不会是 mysql 因为您将 IN 值作为字符串传递而感到困惑?试试 IN (9, 8, 6, ...) (dev.mysql.com/doc/refman/5.0/en/…)
  • 尝试在 WHERE 子句中传递实际的整数值而不是字符串。
  • 不,传递整数对索引的使用没有影响——对于小表,我明白了。我认为下面的 a1ex07 可能有我正在寻找的东西。不过谢谢!

标签: mysql performance mysql-slow-query-log


【解决方案1】:

对于少量的行,完全扫描几乎总是访问表的最快方式。此外,选择性很重要——即使 id 是唯一的,查询也会返回大约 30% 的行(假设您有 20 行)。它出现在慢查询日志中不是因为它很慢,而是因为它不使用索引(它应该是控制该行为的一个选项,我只是不记得它)

更新我刚刚仔细检查,选项是log-queries-not-using-indexes

【讨论】:

  • 这看起来像我需要的——我知道 MySQL 不会在小表上使用索引,但它被记录为“慢”的事实让我感到困惑。现在我明白为什么了。更改该选项会将它们从日志中删除,以便我可以专注于真正的问题。
猜你喜欢
  • 2013-10-26
  • 2013-11-15
  • 2015-06-19
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 2013-10-27
  • 1970-01-01
相关资源
最近更新 更多