MySQL LEFT JOIN ON条件的顺序

时间:2017-05-11 09:02:13

标签: mysql sql join left-join

我有一个MySQL查询,内部连接和一个左连接以及我的数据库中的大量数据,并且运行速度很慢。这大致是我的疑问:

SELECT
    main_table.*
FROM
    main_table
INNER JOIN
    ...
LEFT JOIN
    second_table ON (main_table.id = second_table.ref_id AND second_table.type = 'foo' AND second_table.bar IS NULL
WHERE
    second_table.id IS NULL
;

来自main_table 的条目可能second_table中有一个或多个引用的条目。我希望获得main_table的所有结果,这些结果在second_table中没有结果,或者在第二个表中只有无关数据(type 'foo'bar为NULL)。

查看 EXPLAIN ,MySQL首先搜索bar IS NULL,然后搜索type = 'foo',这仍然会导致数千个结果,而检查{{ 1}}首先只留下很少的结果来检查其他条件。

我只有ref_id的索引,而不是ref_idtype的索引,如果我可以查询{{{{}},我觉得不需要索引它们1}}首先。

- 编辑:我注意到在数据库的副本(它有实际数据并且运行缓慢)上也分别有barref_id的索引,所以这可能就是为什么MySQL比其他键更喜欢type。我正在考虑跨越多个领域的关键.--

有人知道如何优化这种查询吗?是否可以在 ON 条件下使用特定顺序强制MySQL?

“解决方案”:我添加了一个跨越所有相关字段的索引。

我不认为这是一个真正的解决方案,因为我相信,如果首先在索引bar上完成JOIN,它也会更快。当它是唯一的索引时,它可能会这样做,但是我的同事有想法在其他字段中单独添加索引也出于某种原因,可能需要在我们的应用程序中的其他地方。

1 个答案:

答案 0 :(得分:0)

如果将“不相关”行移动到where部分会发生什么? 在我看来,DB应该更容易加入表格,并将使用索引

这样的东西
SELECT
    main_table.*
FROM
    main_table
INNER JOIN
    ...
LEFT JOIN
    second_table ON main_table.id = second_table.ref_id 
WHERE
    second_table.id IS NULL OR 
    (second_table.type = 'foo' AND second_table.bar IS NULL)