【发布时间】:2014-12-18 11:09:49
【问题描述】:
我有一个 SQL 查询,它在 or 条件下连接另一个表,如下所示:
select a.id,b.id from a left join b on (b.prop1=a.id or b.prop2=a.id)
1026 rows in set (12.77 sec)
如果我将查询一分为二,没有或条件,它会快得多:
select a.id,b.id from a left join b on (b.prop1=a.id)
1026 rows in set (0.03 sec)
select a.id,b.id from a left join b on (b.prop2=a.id)
1026 rows in set (0.04 sec)
要快得多,但我必须手动合并两个查询的结果。
为什么我的初始查询这么慢?我该怎么做才能让它更快?
我使用的是 mysql 5.5.35
【问题讨论】:
-
union会更快吗?如果您在a.id上有选择,然后在b.id上有union(全部完全匹配)?您是否还定义了键?还是索引? -
是的
or是杀手。即使它们是 where 子句的一部分,也不能使用索引。另一种方法是使用union all和 2 个查询,其中每个连接条件是分开的。 -
为什么不能或不使用索引?是查询执行器不够聪明还是有更深层次的原因?
标签: mysql sql performance left-join