【问题标题】:MySQL ORDER BY - Slowing Down QueryMySQL ORDER BY - 减慢查询
【发布时间】:2012-10-18 10:47:39
【问题描述】:

问题与在两个表中保存列表数据和潜在客户数据的列表站点有关。在查询列表和每个列表的潜在客户总数时,添加 ORDER BY 后结果非常慢。如果没有 ORDER BY,检索结果会非常快。任何有关重组以下查询的建议或帮助都会很棒!仅供参考,有 20k 个列表和 100k 个潜在客户。

SELECT ls.*, IFNULL(ld.total_leads, 0) AS total_leads
FROM listing ls 
LEFT JOIN (SELECT listing_id, COUNT(listing_id) AS total_leads 
            FROM lead GROUP BY listing_id) ld
ON (ls.listing_id = ld.listing_id)
ORDER BY ls.listing_id DESC LIMIT 0,20

解释:

id select_type table type pos key ke ref rows Extra 
1 PRIMARY ls ALL NULL NULL NULL NULL 17215 Using temporary; Using filesort 
1 PRIMARY 2> ALL NULL NULL NULL NULL 12865 
2 DERIVED lead ALL NULL NULL NULL NULL 117830 Using temporary; Using filesort

【问题讨论】:

  • EXPLAIN 是您在分析和询问有关查询性能的问题时的朋友。
  • id select_type table type pos key ke ref rows Extra 1 PRIMARY ls ALL NULL NULL NULL NULL 17215 使用临时;使用文件排序 1 PRIMARY 2> ALL NULL NULL NULL NULL 12865 2 DERIVED lead ALL NULL NULL NULL NULL 117830 使用临时;使用文件排序
  • 我尝试添加格式更好的解释,但结果不正确……我第一次在这里发帖。

标签: mysql performance sql-order-by


【解决方案1】:

简答: 在listing_id 上创建索引。

(半)长答案: 这将加快该列的排序(但会减慢插入速度)。更多信息:http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html

【讨论】:

    【解决方案2】:

    在两个表的listing_id上创建索引。

    当您包含 order by 子句时,dabatase 必须按正确顺序构建行列表,然后按该顺序返回数据。这可能需要大量额外的处理,从而转化为额外的时间。

    对大量列进行排序可能需要更长的时间,而您的查询可能会返回这些列。在某些时候,您将用完缓冲区空间,数据库将不得不开始交换,性能将下降。

    尝试返回更少的列(指定您需要的列而不是 Select *)并查看查询是否运行得更快。

    【讨论】:

    • 我需要为这个特定查询请求所有列...我已经测试过只请求一个,但它仍然表现不佳。我将在潜在客户表上索引listing_id,看看它是如何进行的。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2020-05-15
    • 2021-06-23
    • 1970-01-01
    • 2012-08-17
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多