1

実行に27秒かかるこのクエリがあります。

SELECT ocal_files.*, count(DISTINCT ocal_favs.username) as favs 
FROM ocal_files
   INNER JOIN ocal_favs on ocal_favs.clipart_id = ocal_files.id 
GROUP BY ocal_files.id 
ORDER BY favs DESC​

(ユーザー用のテーブルがあるため、usernameの代わりにuser_idにする必要があります)

ocal_files37457行あり、18263行ありocal_favsます

説明の編集結果

mysql> EXPLAIN SELECT ocal_files.*, count(DISTINCT ocal_favs.username) as favs FROM ocal_files INNER JOIN ocal_favs on ocal_favs.clipart_i
d = ocal_files.id GROUP BY ocal_files.id ORDER BY favs DESC;                                                                             
+----+-------------+------------+--------+----------------+---------+---------+---------------------------------+-------+---------------------------------+
| id | select_type | table      | type   | possible_keys  | key     | key_len | ref                             | rows  | Extra                           |
+----+-------------+------------+--------+----------------+---------+---------+---------------------------------+-------+---------------------------------+
|  1 | SIMPLE      | ocal_favs  | ALL    | rlb_clipart_id | NULL    | NULL    | NULL                             | 18622 | Using temporary; Using filesort|
|  1 | SIMPLE      | ocal_files | eq_ref | PRIMARY        | PRIMARY | 4       | openclipart.ocal_favs.clipart_id |     1 | Using where                    |
+----+-------------+------------+--------+----------------+---------+---------+---------------------------------+-------+---------------------------------+
2 rows in set (0.00 sec)

なぜ遅いのですか?最適化できますか?はいの場合、どのように?

4

2 に答える 2

2

にインデックスを作成してみてください

ocal_favs ( clipart_id, username )

NOT NULL条件として制約ocal_favs.usernameまたは追加があることを確認してocal_favs.username IS NOT NULLください。

ocal_filesこれにより、そのインデックスからすべての情報を取得できるようになります。

于 2012-07-02T11:59:16.537 に答える
1

最適化を扱う際の良いアプローチSQLは、必要なフィールドのみを選択することです。あなたの場合、すべてのフィールドを選択するわけではありません。これは、特にフィールドがである場合、ほとんどの場合、パフォーマンスに大きな影響を与えますBLOB's。また、他のユーザーが指摘しているように、インデックス作成も非常に重要ですが、適切に作成した場合に限ります。結果を一度に表示する必要がない場合は、句を使用することLIMITもお勧めします(30000以上のレコードの結果を表示するとは思わないため、ここではこれが当てはまるとは思えません。ユーザーブラウザへ)...

于 2012-07-02T11:59:36.317 に答える