首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql查询调优

mysql查询调优
EN

Stack Overflow用户
提问于 2009-12-23 03:40:33
回答 2查看 810关注 0票数 1

我在MYSQL视图中执行了一个查询。这个特定的视图是我们的应用程序的核心,所以我们正在考虑对其进行调优。在Map_Id,User_No,X,Y上有一个主键。我对调优SQL server查询很满意,但不完全确定MySql在这方面是如何工作的。在它上面建立一个涵盖points和update_stamp的索引会有帮助吗?这个表的读取率是90%,所以虽然它有很多插入,但它不能与读取量进行比较。

描述:获取给定地图中每个x,y坐标的点最多的人。按拥有最新更新戳记的用户,然后按用户id打破平局。

代码语言:javascript
复制
    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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-23 04:01:53

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

您说得对,复合索引可能会有所帮助。您甚至可以将其作为覆盖索引。也许我会尝试在Grid_Points(Map_Id,X,Y)上建立索引,或者在Grid_Points(Points,Update_Stamp,User_No)上建立索引。

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

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

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

代码语言:javascript
复制
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中,这种解决方案可能没有这样的优势。

票数 3
EN

Stack Overflow用户

发布于 2009-12-23 03:55:40

我不会匹配它本身,我会以"group by“的形式进行匹配,然后可能会匹配回来,以获得这个人是谁。

按Map_Id,X,Y从Grid_Points组中选择Map_Id,X,Y,max(点);

这将为您提供一个包含Map_Id、X和Y的表,然后是最大点数。然后,您可以将这些结果连接回Grid_Points,以找出哪个用户与这些点对应。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1948652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档