查询拒绝使用索引

时间:2012-12-11 20:01:22

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

使用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的“慢查询”?

1 个答案:

答案 0 :(得分:5)

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

更新我只是双重检查,选项为log-queries-not-using-indexes