gpt4 book ai didi

MySQL Left Join 需要一段时间

转载 作者:行者123 更新时间:2023-12-01 00:23:32 24 4
gpt4 key购买 nike

我正在尝试获取可能的客户列表及其订单历史记录 (ltv) 的总和

没有 order by,这个查询加载不到一秒钟。使用 order by 并且查询耗时超过 90 秒。

SELECT a.customerid,a.firstname,a.lastname,Orders.ltv  
FROM customers a
LEFT JOIN (
SELECT customerid,
SUM(amount) as ltv
FROM orders
GROUP BY customerid) Orders
ON Orders.customerid=a.customerid
ORDER BY
Orders.ltv DESC
LIMIT 0,10

有什么可以加快速度的想法吗?

编辑:我想我对查询的清理有点太多了。查询实际上比这个版本复杂一点。其他数据是从 customers 表中选择的,也可以根据这些数据进行排序。

最佳答案

如果没有实际的模式,很难知道数据是如何相关的,但我想这个查询应该是等效的并且性能更高:

SELECT a.customerid, coalesce(sum(o.amount), 0) TotalLtv FROM customers a
LEFT JOIN orders o ON a.customerid = o.cusomterid
GROUP BY a.customerid
ORDER BY TotalLtv DESC
LIMIT 10

合并 将确保您为没有订单的客户返回0

@ypercube 让我注意到,amount 上的索引也无济于事。您可以尝试一下:

ALTER TABLE orders ADD INDEX(customer, amount)

问题更新后

如果您需要添加更多在功能上依赖于 select 子句中的 a.customerid 的字段,您可以使用非标准的 MySQL group by 子句。这将导致比按 a.customerid, a.firstname, a.lastname 分组更好的性能:

SELECT a.customerid, a.firstname, a.lastname, coalesce(sum(o.amount), 0) TotalLtv
FROM customers a
LEFT JOIN orders o ON a.customerid = o.cusomterid
GROUP BY a.customerid
ORDER BY TotalLtv DESC
LIMIT 10

关于MySQL Left Join 需要一段时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19503096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com