繁体   English   中英

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

[英]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

我可以建议你使用CASE声明

以下是您可以采取的类似问题并扩展到您的需求:

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM