Mysql 选择连接行为空的with JOIN

Mysql 选择连接行为空的with JOIN,mysql,query-optimization,Mysql,Query Optimization,我试图从一个表中选择在另一个表中没有对应关系的行 为此,我目前正在使用左JOIN和WHERE JOIN_table.any_列为NULL,但我认为这不是最快的方法 SELECT * FROM main_table mt LEFT JOIN joined_table jt ON mt.foreign_id=jt.id WHERE jt.id IS NULL 此查询有效,但正如我所说,我正在寻找一种更快的替代方法。您的查询是针对以下内容的标准查询: SELECT * FROM main_table

我试图从一个表中选择在另一个表中没有对应关系的行

为此,我目前正在使用
左JOIN
WHERE JOIN_table.any_列为NULL
,但我认为这不是最快的方法

SELECT * FROM main_table mt LEFT JOIN joined_table jt ON mt.foreign_id=jt.id WHERE jt.id IS NULL

此查询有效,但正如我所说,我正在寻找一种更快的替代方法。

您的查询是针对以下内容的标准查询:

SELECT *
FROM main_table mt LEFT JOIN
     joined_table jt
     ON mt.foreign_id=jt.id
WHERE jt.id IS NULL;
您也可以尝试以下方法:

SELECT mt.*
FROM main_table mt
WHERE not exists (select 1 from joined_table jt where mt.foreign_id = jt.id);

在MySQL的某些版本中,它可能会产生更好的执行计划。

您正在运行的查询通常是最快的选项,只需确保您有mt.foreign\u id和jt.id的索引即可


您提到此查询更复杂,因此问题可能在查询的另一部分。您应该检查执行计划,看看有什么错误并加以修复。

根据我使用MSSQL的经验,使用的语法(通常)与
WHERE NOT EXISTS()语法产生完全相同的查询计划,但是这是mysql,所以我不能确定性能

也就是说,我更喜欢使用
WHERE NOT EXISTS()
语法,原因如下:

  • 它更容易阅读。如果你说一点英语,任何人都可以推断出这个问题的意思
  • 更简单的是,我见过有人在一个可以为NULL的字段上测试NULL
  • 它不能有副作用,如“双倍记录”由于加入。如果引用的字段是唯一的,则没有问题,但我也看到过这样的情况,即人们选择了“键不足”,导致主表对联接表进行多次点击。。。当然,他们用DISTINCT(aarrgg!!!=)再次解决了这个问题
至于性能,请确保在引用的字段上有一个(唯一)索引,如果可能,请在两个表之间建立FK关系。我怀疑你能从中挤出更多


我的2美分。

这就是我的方法。请尝试
explain select…
查看您可能需要在何处添加索引。@juergend的可能重复问题是,我的实际查询要长得多、复杂得多,因此速度太慢,MySQL服务器在10分钟后超时。所以我正在尝试对查询的各个部分进行优化。谢谢。如果我在两列上都有索引,但没有FK关系,那么在性能方面会有很大的影响吗?就像很多db内容一样:唯一的方法就是尝试一下。