使用LEFT JOIN中的索引和OR条件

时间:2014-01-15 10:21:10

标签: mysql join

请考虑以下查询:

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)但没有成功。

2 个答案:

答案 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)

我建议你使用CASE statement

Here是一个类似的问题,您可以采取并扩展到您的需求:

希望这有帮助