1

问题与在两个表中保存列表数据和潜在客户数据的列表站点有关。在查询列表和每个列表的潜在客户总数时,添加 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
4

2 回答 2

2

简短回答:listing_id.

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

于 2012-10-18T10:54:22.263 回答
0

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

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

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

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

于 2012-10-18T10:56:31.503 回答