请考虑以下查询:
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'。根据{{3}}:
加入类型“ALL”:对来自的每个行组合进行全表扫描 以前的表格。
查询非常慢。
但是当我删除其中一个条件时,它将是:
LEFT JOIN table3 ON
table3.some_primary_key = table1.some_primary_key
OR
LEFT JOIN table3 ON
table3.column_with_index = table2.column_with_index
Mysql正在使用索引。在EXPLAIN
结果索引显示在'keys'列中,type为'ref'。查询速度非常快。
在join语句中使用OR
时如何让mysql使用我的索引?
我尝试LEFT JOIN table3 FORCE INDEX(PRIMARY, ind_column)
但没有成功。
答案 0 :(得分:1)
将您的查询拆分为两个查询,每个查询使用与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
答案 1 :(得分:1)