2012-12-11 34 views
0

使用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的「緩慢查詢」?

+0

難道是因爲你傳遞IN值作爲字符串的MySQL是困惑?嘗試IN(9,8,6,...)(http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_in) – Alex

+0

嘗試在您的WHERE子句中傳遞實際的整數值而不是字符串。 –

+0

不,傳遞整數對索引的使用沒有影響 - 用小表格就可以了。我認爲下面的a1ex07可能有我在找的東西。雖然謝謝! –

回答

5

對於少量的行,全面掃描幾乎總是訪問表的最快方式。此外,選擇性很重要 - 即使id是唯一的,查詢返回大約30%的所有行(假設您有20個)。它出現在緩慢的查詢日誌不是因爲它很慢,而是因爲它不使用索引(它應該是一個選項來控制這種行爲,我只是不記得它從我的頭頂)

更新我只是雙重檢查,選項是log-queries-not-using-indexes

+0

這看起來像我所需要的 - 我知道MySQL不會在小表上使用索引,但它被記錄爲「慢」的事實讓我感到困惑。現在我明白了爲什麼。改變這個選項將它們從日誌中刪除,這樣我就可以專注於真正的問題。 –