gpt4 book ai didi

sql - mysql查询调优

转载 作者:行者123 更新时间:2023-11-29 05:00:11 24 4
gpt4 key购买 nike

我在 MYSQL View 中创建了一个查询。这个特定的 View 是我们应用程序的核心,所以我们正在考虑调整它。 Map_Id,User_No,X,Y 上有一个主键。我对调整 SQL 服务器查询非常自在,但不完全确定 MySql 在这方面的工作方式。在其上放置一个涵盖点和 update_stamp 的索引是否有帮助?此表上的读取为 90%,因此虽然它有很多插入,但它无法与读取量进行比较。

描述:获取给定 map 中每个 x,y 坐标点最多的人。按谁拥有最新更新戳,然后按用户 ID 决胜负。

    SELECT GP.Map_Id AS Map_Id,GP.User_No AS User_No,GP.X AS X,GP.Y AS Y, GP.Points AS Points,GP.Update_Stamp AS Update_Stamp
FROM (Grid_Points GP LEFT JOIN Grid_Points GP2
ON (
(
(GP2.Map_Id = GP.Map_Id) AND (GP2.X = GP.X) AND (GP2.Y = GP.Y) AND
((GP2.Points > GP.Points) OR ((GP2.Points = GP.Points) AND (GP2.Update_Stamp > GP.Update_Stamp)) OR
((GP2.Points = GP.Points) AND (GP2.Update_Stamp = GP.Update_Stamp) AND (GP2.User_No < GP.User_No)))
)
)
)

WHERE ISNULL(GP2.User_No);

最佳答案

哇,伙计,你真的很喜欢使用括号。 :-)

你是对的,复合索引可能会有所帮助。您甚至可以将其设为覆盖索引。我尝试的可能是 Grid_Points(Map_Id,X,Y) 上的索引或 Grid_Points(Points,Update_Stamp,User_No) 上的索引。

始终使用 EXPLAIN 测试查询优化查看优化器是否正在使用您的索引。阅读该文档部分,直到您理解 EXPLAIN 报告中的神秘注释。

EXPLAIN 报告可能会告诉您它决定使用哪个索引。您应该知道,MySQL 在给定查询中每个表仅使用一个索引

下面是我将如何编写该查询,依赖于 ANDOR 之间的优先顺序,而不是那么多嵌套的括号:

SELECT GP.Map_Id, GP.User_No, GP.X, GP.Y, GP.Points, GP.Update_Stamp
FROM Grid_Points GP LEFT JOIN Grid_Points GP2
ON GP2.Map_Id = GP.Map_Id AND GP2.X = GP.X AND GP2.Y = GP.Y
AND (
GP2.Points > GP.Points
OR
GP2.Points = GP.Points
AND GP2.Update_Stamp > GP.Update_Stamp
OR
GP2.Points = GP.Points
AND GP2.Update_Stamp = GP.Update_Stamp
AND GP2.User_No < GP.User_No
)
WHERE GP2.User_No IS NULL;

您正在使用我最喜欢的方法在 MySQL 中查找每组最大 n 值。 MySQL 没有很好地优化 GROUP BY(它通常会产生一个序列化到磁盘的临时表),因此您使用的左外连接解决方​​案通常要好得多,至少对于MySQL。在其他品牌的RDBMS中,这种方案可能没有这样的优势。

关于sql - mysql查询调优,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1948652/

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