首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql order by性能优化

mysql order by性能优化
EN

Stack Overflow用户
提问于 2014-12-21 18:23:03
回答 1查看 157关注 0票数 0

您好,我喜欢做一个高性能的订单查询。这是我的问题:

代码语言:javascript
复制
SELECT a.status,a.title,a.id,
b.deployed,b.accepted,b.rejected,b.error
FROM a
LEFT JOIN b ON ( a.id = b.id )
WHERE b.agencyid = 1 AND a.userid = 3
ORDER BY a.date DESC
LIMIT 0,50

如果不使用ORDER BY子句,则查询需要0.006秒,如果使用ORDER BY子句,则需要1.1181秒!

最多的时间消耗来自复制到Tmp表1,1 s 99,78% 1,1,1 s如何减少复制到tpm表的时间?

EN

回答 1

Stack Overflow用户

发布于 2014-12-21 23:42:22

首先,正如Strawberry所指出的,因为您在where子句中引用了"b“别名,并且没有考虑NULL,所以它本质上将您的左连接转换为内连接。

代码语言:javascript
复制
SELECT 
      a.status,
      a.title,
      a.id,
      b.deployed,
      b.accepted,
      b.rejected,
      b.error
   FROM a JOIN b 
      ON a.id = b.id
   WHERE 
          a.userid = 3
      AND b.agencyid = 1 
   ORDER BY 
      a.date DESC
   LIMIT 
      0,50

如果您希望它是左连接(所有"a“记录,不管"b”表中是否有匹配),那么您需要将"b“限定符移动到JOIN子句。

代码语言:javascript
复制
SELECT 
      a.status,
      a.title,
      a.id,
      b.deployed,
      b.accepted,
      b.rejected,
      b.error
   FROM a LEFT JOIN b 
      ON a.id = b.id
      AND b.agencyid = 1 
   WHERE 
      a.userid = 3
   ORDER BY 
      a.date DESC
   LIMIT 
      0,50

也就是说,您正在寻找按日期排序的特定用户。我会让你的"a“表在(userid,date)上建立索引,这样引擎就可以在你的WHERE限定符和order by上进行优化,并且应该解决你的性能问题,而不管left和inner ...

为了帮助你的"b“表的连接条件,索引它(id,agencyid)

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

https://stackoverflow.com/questions/27588491

复制
相关文章

相似问题

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