我有一个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_id
或type
的索引,如果我可以查询{{{{}},我觉得不需要索引它们1}}首先。
- 编辑:我注意到在数据库的副本(它有实际数据并且运行缓慢)上也分别有bar
和ref_id
的索引,所以这可能就是为什么MySQL比其他键更喜欢type
。我正在考虑跨越多个领域的关键.--
有人知道如何优化这种查询吗?是否可以在 ON 条件下使用特定顺序强制MySQL?
“解决方案”:我添加了一个跨越所有相关字段的索引。
我不认为这是一个真正的解决方案,因为我相信,如果首先在索引bar
上完成JOIN,它也会更快。当它是唯一的索引时,它可能会这样做,但是我的同事有想法在其他字段中单独添加索引也出于某种原因,可能需要在我们的应用程序中的其他地方。
答案 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)