mysql索引和优化,使用where;临时使用;使用filesort
问题描述:
哪些表和列应该有索引?我有一个关于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)
答
为了避免文件排序,你会希望在(flow_permanent_id
,entry_id
)一个综合指数,这样的MySQL可以使用索引的WHERE和GROUP BY两者。
答
首先 - 在某些情况下可以改善性能,请使用COUNT(1)而不是COUNT(*)。切勿使用COUNT(*)。第二种:它看起来像您使用的索引,它在EXPLAIN输出的'key'列中列出。 你的“GROUP BY”是导致文件夹的东西。通常它是ORDER BY这是罪魁祸首,但我看到GROUP BY也可以做到这一点。
希望这会有所帮助。
Oleg,在COUNT(*)上使用COUNT(1)没有性能改进。事实上,他们被视为平等。 – Ami
@Ami虽然我基本同意你的看法,但这对你来说可能是一个有趣的读物。 http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/ – fancyPants