は、私は3つのテーブルを持っています。MySQLのグループ化クエリの最適化
カテゴリのテーブルと最新のイベントstatus_idが「1」である記事の数が返されます。
私はこれまでのところ動作していますが、テーブルのサイズがかなり遅い(10秒)。これをもっと速くする方法があるのだろうかと思っています。すべてのテーブルは、私が知る限り、適切なインデックスを持っています。
SELECT c.id,
c.name,
SUM(CASE WHEN e.status_id = 1 THEN 1 ELSE 0 END) article_count
FROM categories c
LEFT JOIN articles a ON a.category_id = c.id
LEFT JOIN (
SELECT article_id, MAX(id) event_id
FROM article_events
GROUP BY article_id
) most_recent ON most_recent.article_id = a.id
LEFT JOIN article_events e ON most_recent.event_id = e.id
GROUP BY c.id
基本的に私はちょうどMAX(ID)の行に関連付けられているものを最初に見つかっSTATUS_IDは戻り、ないMAX(ID)と共にSTATUS_IDを求めているので、二倍イベントテーブルに参加しなければなりません。
これを改善する方法はありますか?それとも10秒で生きなければならないのですか?ありがとう!
編集:
ここだ私のクエリのEXPLAIN:
ID | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
---------------------------------------------------------------------------------------------------------------------------
1 | PRIMARY | c | index | NULL | PRIMARY | 4 | NULL | 124044 | Using index; Using temporary; Using filesort
1 | PRIMARY | a | ref | category_id | category_id | 4 | c.id | 3 |
1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 6351 |
1 | PRIMARY | e | eq_ref | PRIMARY | PRIMARY | 4 | most_recent.event_id | 1 |
2 | DERIVED | article_events | ALL | NULL | NULL | NULL | NULL | 19743 | Using temporary; Using filesort
質問のために 'EXPLAIN ...'の出力をここに投稿してください。 – vyegorov