2012-05-15 122 views
3

哪些表和列應該有索引?我有一個關於flow_permanent_id和entry_id的索引,但似乎使用的是filesort?mysql索引和優化,使用where;臨時使用;使用filesort

我能做些什麼來優化這個?

mysql> explain SELECT COUNT(*) AS count_all, entry_id AS entry_id FROM `votes` WHERE `votes`.`flow_permanent_id` = '4fab490cdc1c82cfa800000a' GROUP BY entry_id; 
+----+-------------+-------+------+----------------------------------+----------------------------------+---------+-------+------+----------------------------------------------+ 
| id | select_type | table | type | possible_keys     | key        | key_len | ref | rows | Extra          | 
+----+-------------+-------+------+----------------------------------+----------------------------------+---------+-------+------+----------------------------------------------+ 
| 1 | SIMPLE  | votes | ref | index_votes_on_flow_permanent_id | index_votes_on_flow_permanent_id | 74  | const | 1 | Using where; Using temporary; Using filesort | 
+----+-------------+-------+------+----------------------------------+----------------------------------+---------+-------+------+----------------------------------------------+ 
1 row in set (0.00 sec) 

回答

7

爲了避免文件排序,你會希望在(flow_permanent_identry_id)一個綜合指數,這樣的MySQL可以使用索引的WHERE和GROUP BY兩者。

1

首先 - 在某些情況下可以改善性能,請使用COUNT(1)而不是COUNT(*)。切勿使用COUNT(*)。第二種:它看起來像您使用的索引,它在EXPLAIN輸出的'key'列中列出。 你的「GROUP BY」是導致文件夾的東西。通常它是ORDER BY這是罪魁禍首,但我看到GROUP BY也可以做到這一點。

希望這會有所幫助。

+1

Oleg,在COUNT(*)上使用COUNT(1)沒有性能改進。事實上,他們被視爲平等。 – Ami

+0

@Ami雖然我基本同意你的看法,但這對你來說可能是一個有趣的讀物。 http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/ – fancyPants

相關問題