gpt4 book ai didi

mysql - 如何优化这个复杂的查询?

转载 作者:可可西里 更新时间:2023-11-01 07:39:46 24 4
gpt4 key购买 nike

我如何优化这个查询?现在它在 0.0100 秒内执行。

SELECT comments.comment_content, comments.comment_votes, comments.comment_date,
users.user_login, users.user_level, users.user_avatar_source,
groups.group_safename
FROM comments
LEFT JOIN links ON comment_link_id=link_id
LEFT JOIN users ON comment_user_id=user_id
LEFT JOIN groups ON comment_group_id=link_group_id
WHERE comment_status='published' AND link_status='published'
ORDER BY comment_id DESC

解释输出:

enter image description here

索引:

评论:

enter image description here

用户:

enter image description here

群组:

enter image description here

最佳答案

低于 20 毫秒的查询时间通常不会被认为是慢的。正如一些人在评论中提到的那样,当您的表变大时,您有必要重新进行优化,因为 MySQL 的优化器(以及其他 RDMS 的优化器)根据索引大小做出决策。

我建议您始终在 JOIN 子句中使用表名或别名来限定您的列名。例如,您将通过使用如下样式获得清晰度和可维护性:

FROM comments AS c
LEFT JOIN links AS L ON c.comment_link_id=L.link_id
LEFT JOIN users AS u ON c.comment_user_id=u.user_id
LEFT JOIN groups AS g ON c.comment_group_id=g.link_group_id

此查询选择了相当广泛的表子集,因此表越大,它的运行速度就越慢。这是不可避免的,除非您能以某种方式缩小子集。

您用于JOIN ... ON 操作的列是否都声明为NOT NULL?他们应该是。

查看您如何使用 groups 表:您正在加入 link_group_id 并检索 group_safename。因此,尝试在 (link_group_id,group_safename) 上使用复合覆盖索引。至少,索引 link_group_id

users 表:您已经在 user_id 上建立了索引。当您的表变大时,(user_id, user_login, user_level, user_avatar_source) 上的复合覆盖索引可能会有所帮助。但这是一个低优先级的尝试。

links 表:您正在使用 link_statuslink_id。此表的 LEFT JOIN 应该是一个普通的内部 JOIN,因为其中一列显示在您的 WHERE 子句中。如果 link_status 在您的应用程序中可以是 NOT NULL,请确保以这种方式声明它。然后在 (link_status, link_id) 上尝试复合索引。

comments 表:据我所知,您没有关于 comment_status 的索引。尝试添加一个。

然后将一堆数据放入表中,为每个表运行 OPTIMIZE LOCAL TABLE,然后再次尝试使用 EXPLAIN 进行查询。

关于mysql - 如何优化这个复杂的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23162206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com