【发布时间】: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