问题涉及在两个表中保存列表数据和潜在客户数据的列表网站。在对列表和每个列表的潜在客户总数进行查询时,添加ORDER BY后结果非常慢。如果没有ORDER BY,则可以非常快速地检索结果。任何有关重构以下查询的建议或帮助都会很棒!! Fyi,有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
答案 0 :(得分:2)
简答:
在listing_id
上创建索引。
(半)长答案: 这将加快该列的排序速度(但减慢插入速度)。更多信息:http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html
答案 1 :(得分:0)
在两个表的listing_id上创建索引。
当您包含order by子句时,dabatase必须以正确的顺序构建行列表,然后按该顺序返回数据。这可能需要大量的额外处理,这会转化为额外的时间。
对查询可能返回的大量列进行排序可能需要更长时间。在某些时候,你将耗尽缓冲区空间,数据库必须开始交换,并且性能将下降。
尝试返回较少的列(指定所需的列而不是Select *)并查看查询是否运行得更快。