首页 > 解决方案 > 优化连接中的 MySQL "OR" 查询

问题描述

在 MySql 5.7 中使用多表连接的“或”查询时遇到了一些困难。

例如,假设我想要一个当前在某个位置或正在运送到那里的动物列表。

Select * from animals
left outer join animal_locations on animals.id = animal_locations.animal_id
left outer join animal_shipments on animals.id = animal_shipments.animal_id
where animal_locations.location_id = 5 OR animal_shipments.location_id = 5

使用“AND”以及使用没有任何运算符的单个列时,查询非常快。但是当使用“OR”查询时,性能会受到很大影响,正确的索引不会受到影响。

有什么方法可以在不将其拆分为多个查询的情况下实现这一点?

标签: mysql

解决方案


SELECT * 
FROM animals
LEFT OUTER JOIN animal_locations ON animals.id = animal_locations.animal_id
                                AND animal_locations.location_id = 5
LEFT OUTER JOIN animal_shipments ON animals.id = animal_shipments.animal_id
                                AND animal_shipments.location_id = 5
WHERE COALESCE(animal_locations.animal_id, animal_shipments.animal_id) IS NOT NULL

逻辑 - 以前从表中的行location_id = 5被过滤,然后过滤的行被连接到主表。


推荐阅读