具有3个连接的SQL查询优化

问题描述 投票:1回答:1

我正在根据执行时间来学习查询优化的行为。我有3个表,分别是帖子,评论和用户。下面的查询通过返回发表评论多于2010年及其帖子数的用户和他们的计数来完美地工作。我相信可以对其进行优化,并且希望您对优化的代码进行解释。

每张桌子上的信息

  • 用户表;有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;

在上面的查询中,有两个子查询。一个用于发布信息,另一个用于评论。我想看看如何优化它以减少执行时间。

上述查询的结果,以及我的EXPLAIN查询的附件:enter image description hereenter image description here

mysql sql query-optimization database-performance query-performance
1个回答
3
投票

一件事突然向我扑来。您的两个子查询中都有这种类型的行。

© www.soinside.com 2019 - 2024. All rights reserved.