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