3

どのテーブルと列にインデックスを付ける必要がありますか?flow_permanent_idとentry_idにインデックスがありますが、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)
4

2 に答える 2

7

ファイルソートを回避するには、MySQLがWHEREとGROUP BYの両方にインデックスを使用できるように、 ( flow_permanent_id、 )に複合インデックスが必要です。entry_id

于 2012-05-15T22:31:30.677 に答える
1

まず、COUNT(*)の代わりにCOUNT(1)を使用します。これにより、パフォーマンスが向上する場合があります。COUNT(*)は絶対に使用しないでください。

2番目:インデックスが使用されているように見えます。これは、EXPLAIN出力の「key」列にリストされています。あなたの"GROUPBY"は、filesortを引き起こしているものです。通常、それが原因であるORDER BYですが、GROUPBYでも同様に実行できることを確認しました。

お役に立てれば。

于 2012-05-15T22:41:11.483 に答える