使用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的「緩慢查詢」?
難道是因爲你傳遞IN值作爲字符串的MySQL是困惑?嘗試IN(9,8,6,...)(http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_in) – Alex
嘗試在您的WHERE子句中傳遞實際的整數值而不是字符串。 –
不,傳遞整數對索引的使用沒有影響 - 用小表格就可以了。我認爲下面的a1ex07可能有我在找的東西。雖然謝謝! –