Mysql 在带或条件的左联接中使用索引

Mysql 在带或条件的左联接中使用索引,mysql,join,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_in

考虑以下问题:

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
join(但是索引显示在“可能的_键”中)。键入:“全部”。根据:

联接类型“ALL”:对来自 以前的表格

查询速度太慢了

但当我删除其中一个条件时,它将是:

LEFT JOIN table3 ON
   table3.some_primary_key = table1.some_primary_key

Mysql正确地使用了索引。在
EXPLAIN
中,结果索引显示在“键”列中,类型为“ref”。查询的速度非常快

在join语句中使用
时,如何让mysql使用我的索引?


我尝试了
左联接表3强制索引(主,索引列)
,但没有成功。

将查询拆分为两个查询,每个查询使用与
不同的条件,然后使用
联合将它们合并

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

我可以建议你使用

是一个类似的问题,您可以回答并扩展到您的需要:


希望这能有所帮助

我认为许多数据库在使用
索引时遇到问题。您在查询的投影部分有多大的自由度?我想在一个大查询中加载所有数据,抱歉,我无法更具体地说明。到目前为止,我想到的是两个table3连接(table3a,table3b)和
SELECT
part中的
CASE
(如果table3a primary不为null,则使用table3a字段。如果table3b primary不为null,则使用table3b字段)。也许我可以去其他的解决方法,但我问这个问题是因为我很好奇这个问题有没有真正好的解决方法。另外:您是否尝试过在
一些主键和
列宽度索引上使用复合索引?@okiharaherbst刚刚尝试过,没有成功。同意,但缺点是
表2
连接操作发生两次,并且
联合
代价高昂。不幸的是,我认为MySQL不能很好地优化
。我认为对于任何特定的联接,每个表只能使用一个索引,这将需要对
中的每个条件使用不同的索引。就我而言,2xJOIN with case语句比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