【发布时间】:2020-08-08 01:09:01
【问题描述】:
我正在学习关于执行时间的查询优化行为。我有 3 个表,分别是帖子、cmets 和用户。通过返回在 2010 年发表的 cmets 数超过帖子数的用户及其计数,以下查询完美运行。我相信它可以被优化,我会很感激带有解释的优化代码。
每个表的信息
- 用户表;有 40325 行,在其主键 (Id) 上有索引。
- 帖子表;有 91986 行,在其主索引上 key(PostId) 以及 OwnerUserId 是外键 引用用户表。
- 评论表 - 有 174305 行,在其主键 UserId(用于用户表)和 PostId(用于帖子表)上建立索引。
SELECT pos_table.user_ID, pos_table.Username, comms, pos from
(SELECT
users.Id as 'user_ID', users.DisplayName as 'Username', count(posts.Id) as pos
FROM
users
INNER JOIN posts ON posts.OwnerUserId = users.Id
WHERE YEAR(posts.CreationDate) = 2010
group by users.Id
) pos_table
JOIN
(SELECT
users.Id as 'user_ID', users.DisplayName as 'Username', count(comments.Id) as
comms
FROM
users
INNER JOIN comments ON comments.UserId = users.Id
WHERE YEAR(comments.CreationDate) = 2010
group by users.Id
) comms_table
on pos_table.user_ID = comms_table.user_ID
HAVING comms > pos
order by user_ID
limit 50;
在我上面的查询中,有两个子查询。一个用于帖子,另一个用于 cmets。我想看看如何优化它以减少执行时间。
【问题讨论】:
-
我们需要更多信息来帮助您优化这一点。请阅读meta.stackoverflow.com/a/271056 并特别注意查询优化部分。那么请edit您的问题向我们展示表定义和查询计划。
-
执行命令 EXPLAIN 与您一起查询与我们共享的输出
-
请原谅,这是我的第一个问题。如果我错过了任何重要的细节,请告诉我。谢谢
-
您编辑的问题看起来不错。查询性能是一项棘手的工作,您拥有的信息越多越好。
标签: mysql sql query-optimization database-performance query-performance