我有三个表:类别,文章和article_events,具有下列结构分组的MySQL查询优化
categories: id, name (100,000 rows)
articles: id, category_id (6000 rows)
article_events: id, article_id, status_id (20,000 rows)
每个物品列最高article_events.id描述了每篇文章的当前状态。
我返回类别的表,有多少文章是他们的“1”最近期的事件STATUS_ID。
我迄今为止的工作,但相当慢(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只返回找到的第一个STATUS_ID,而不是与MAX(ID)行相关的一个。
任何方式加以改善?或者我只需要10秒钟?谢谢!
编辑:
这里是我的解释查询:
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