如何改进慢 MySQL 子查询
How to improve slow MySQL subquery
我知道有很多 questions/answers 查询速度慢,但我很难将现有答案与我的示例相关联。
我有以下简单查询,它计算子查询中的文章浏览量:
SELECT
articles.id,
articles.views,
articles.title,
articles.slug,
articles.created_at,
(SELECT count(*) FROM tracking WHERE element_id = articles.id AND tracking_type = 'article_view') AS tracking_views
FROM articles
WHERE articles.company_id = 123
ORDER BY articles.created_at DESC
这家公司有 ~250 篇文章,查询需要 12 秒。
有没有 better/more 有效的方法可以做到这一点?
尝试加入群组。虽然不知道有多少文章/观点和公司,但很难说。
你想要的是 SQL 能够一次性聚合 tracking
,而不是单独聚合结果中的每一行,这由你的位置暗示tracking_view
子 select.
如果幸运的话(我没有检查)加入 counts
子 select 将足够聪明,可以跳过任何不适合公司的文章。如果没有,您可以在 counts
子 select.
中包含加入公司
例如
select a.*, counts.count
from articles a
join (
select count(*) as count, element_id
from tracking
where tracking_type = 'article_view'
group by tracking.element_id
) as counts on counts.element_id = a.id
where a.company_id = 123
ORDER BY articles.created_at DESC
我知道有很多 questions/answers 查询速度慢,但我很难将现有答案与我的示例相关联。
我有以下简单查询,它计算子查询中的文章浏览量:
SELECT
articles.id,
articles.views,
articles.title,
articles.slug,
articles.created_at,
(SELECT count(*) FROM tracking WHERE element_id = articles.id AND tracking_type = 'article_view') AS tracking_views
FROM articles
WHERE articles.company_id = 123
ORDER BY articles.created_at DESC
这家公司有 ~250 篇文章,查询需要 12 秒。
有没有 better/more 有效的方法可以做到这一点?
尝试加入群组。虽然不知道有多少文章/观点和公司,但很难说。
你想要的是 SQL 能够一次性聚合 tracking
,而不是单独聚合结果中的每一行,这由你的位置暗示tracking_view
子 select.
如果幸运的话(我没有检查)加入 counts
子 select 将足够聪明,可以跳过任何不适合公司的文章。如果没有,您可以在 counts
子 select.
例如
select a.*, counts.count
from articles a
join (
select count(*) as count, element_id
from tracking
where tracking_type = 'article_view'
group by tracking.element_id
) as counts on counts.element_id = a.id
where a.company_id = 123
ORDER BY articles.created_at DESC