[英]Using index in LEFT JOIN with OR condition
考虑以下查询:
SELECT *
FROM table1
LEFT JOIN table2 ON
table2.some_primary_key = table1.some_primary_key
LEFT JOIN table3 ON
table3.some_primary_key = table1.some_primary_key OR -- this is the issue
table3.column_with_index = table2.column_with_index
当我检查EXPLAIN
它显示我没有使用table3
连接的索引(但是索引显示在“possible_keys”中)。 输入:'ALL'。 根据手册 :
连接类型“ALL”:对前面表格中的每个行组合进行全表扫描。
查询非常慢。
但是,当我删除其中一个条件时,它将是:
LEFT JOIN table3 ON
table3.some_primary_key = table1.some_primary_key
要么
LEFT JOIN table3 ON
table3.column_with_index = table2.column_with_index
Mysql正在使用索引。 在EXPLAIN
结果索引显示在“键”列中,类型为“ref”。 查询速度非常快。
如何在连接语句中使用OR
使mysql使用我的索引?
我试过LEFT JOIN table3 FORCE INDEX(PRIMARY, ind_column)
但没有成功。
将查询拆分为两个查询,每个查询使用与OR
不同的条件,然后使用UNION
将它们组合在一起。
SELECT *
FROM table1
LEFT JOIN table2 ON
table2.some_primary_key = table1.some_primary_key
LEFT JOIN table3 ON
table3.some_primary_key = table1.some_primary_key
UNION
SELECT *
FROM table1
LEFT JOIN table2 ON
table2.some_primary_key = table1.some_primary_key
LEFT JOIN table3 ON
table3.column_with_index = table2.column_with_index
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.