MySQL左连接使查询非常慢......我怎么能重构?

时间:2018-05-07 00:18:51

标签: php mysql

我有运行MYSQL查询的PHP系统,如下所示

select
order.id,
order.name,
order.date,
customer.name,
items.coupon_code,
from order
left join customer on order.custid = customer.id
left join items on items.coupon_code = order.coupon_code
where items.coupon_new_code is null
and order.status = 1000
AND order.promo_code in (1,2)

订单表有800K记录,而item表有300k记录。当我运行此查询时,大约需要9个小时才能完成!

如果我将左连接注释到items表,那么查询将在几秒钟后运行!我对MySQL连接效率不高,如果有人能告诉我如何优化这个查询以便在可接受的时间范围内运行,我真的很感激。

2 个答案:

答案 0 :(得分:1)

尝试更改

LEFT JOININNER JOIN(或仅JOIN

假设您只想查看同时拥有客户和与之相关的商品的订单,这将有助于加快速度。目前,您的查询正在尝试从order表返回所有数据,但这不是必需的。对数据库结构进行其他更改也可以改进。

The top answer here提供了一个有用的图表,演示了这些类型的语句之间的区别。

答案 1 :(得分:1)

至少,您需要coupon_codeorder表上的items索引。还可以考虑添加复合索引,您在custid上加入的其他字段,以及WHERE条件items.coupon_new_codeorder.statusorder.promo_code。几乎不了解您的数据我只能推测dbms将使用什么。尝试复合键中的各种组合并运行说明以查看正在使用的内容。它真的取决于列中数据的特殊性。

EXPLAIN的输出与表格'一起发布架构将帮助我们改进这些答案。