mysql - 优化连接中的 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”查询时,性能会受到很大影响,正确的索引不会受到影响。
有什么方法可以在不将其拆分为多个查询的情况下实现这一点?
解决方案
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
被过滤,然后过滤的行被连接到主表。
推荐阅读
- symfony - Sylius:如何不执行一些固定装置,但保持原版文件不变?
- laravel - Laravel DB::select 返回一般错误:2031
- java - 如何将数组值放入 dbSqlite 上的数据库?
- java - 如何使用 java.awt.Robot 发送包含大写字母和小写字符以及特殊字符的字符串?
- strapi - 是否可以在strapi 上的定制端点上获取原始身体?
- python - 使用正则表达式从以某些字符开头的列中删除子字符串
- python - ProcessPoolExecutor 开销??对于大型矩阵运算,并行处理比单个处理花费更多时间
- python - 如何将我的 python 乌龟代码中的文本对齐在中间而不是在顶部?
- android - 可绘制屏幕上的 Cordova sdk“已弃用”警告和错误
- mysql - 在mysql中进行UPDATE时如何在多行中设置唯一值