【问题标题】:mysql order by performance optimizationmysql order by 性能优化
【发布时间】:2014-12-21 10:23:02
【问题描述】:

您好,我喜欢通过查询下订单。 这是我的查询:

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 s !!!

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

【问题讨论】:

  • 对表的日期列使用索引。
  • 你的临时表在哪里?我在上面的代码中没有看到它。您确定只是这部分需要很长时间,还是您也有 proc 和其他查询?
  • 请提供:1. 两个表的完整模式(使用SHOW CREATE TABLE) 2. 给定查询的EXPLAIN。 PS:表b 上的谓词之一是否在WHERE 子句中而不是ON 中?如果是这样 - 为什么是 LEFT JOIN 而不是 INNER JOIN
  • 这是一个内部连接。删除 LEFT 关键字

标签: mysql performance sql-order-by


【解决方案1】:

首先,正如 Strawberry 所指出的,因为您在 where 子句中引用了“b”别名,并且不考虑 NULL,所以它实质上将您的左联接变成了 INNER JOIN。

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

如果您打算让它成为 LEFT-JOIN(所有“a”记录,而不管“b”表中的匹配项),那么您需要将“b”限定符移动到 JOIN 子句。

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

话虽如此,您正在寻找按日期排序的特定用户。我会在 (userid, date) 上为您的“a”表编制索引,以便引擎可以根据您的 WHERE 限定符和顺序进行优化,并且无论左连接和内连接如何,都应该解决您的性能问题...

为了帮助您的“b”表连接条件,将其索引到 (id, Agencyid)

【讨论】:

  • @masterofweb,这是否有助于甚至回答您遇到的问题?它仍然显示为打开状态。另外,请查看本网站的帮助 -> TOUR 了解基本礼仪。
猜你喜欢
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多