我需要将三个表连接在一起。第一个有 ~100k 行,第二个 ~300k 行,最后一个 ~40 行。第一个和第二个应该由一个复合条件连接,但这是诀窍。查询要求它是一个OR
条件。由于 OR 条件,索引无法正确使用。我尝试将两个困难的表分离为两个单独的查询,并将它们与 union 连接以帮助 mysql 找到正确的索引。
我能做些什么来优化这个查询?
select * from a, b, c where (a.x = b.x OR a.y = b.y) and b.z = c.z
我需要将三个表连接在一起。第一个有 ~100k 行,第二个 ~300k 行,最后一个 ~40 行。第一个和第二个应该由一个复合条件连接,但这是诀窍。查询要求它是一个OR
条件。由于 OR 条件,索引无法正确使用。我尝试将两个困难的表分离为两个单独的查询,并将它们与 union 连接以帮助 mysql 找到正确的索引。
我能做些什么来优化这个查询?
select * from a, b, c where (a.x = b.x OR a.y = b.y) and b.z = c.z
尝试 2 个查询的 UNION:-
select *
from a
INNER JOIN b ON a.x = b.x
INNER JOIN c ON and b.z = c.z
UNION
select *
from a
INNER JOIN b ON a.y = b.y
INNER JOIN c ON and b.z = c.z
(在实际应用中,我同意不使用 SELECT *)
我将从使用 ANSI 连接语法开始,然后使用它EXPLAIN
来优化查询:
select *
from a
inner join b on a.x = b.x OR a.y = b.y
inner join c on b.z = c.z
你应该这样做
select
[your column names]
from a
inner join b
on a.x = b.x
OR a.y = b.y
inner join c
on b.z = c.z