如何强制连接顺序以提高 MYSQL 中的查询性能?
How to force the order of the joins to improve query performance in MYSQL?
我有一个sql声明
SELECT count(*)
From table1
inner join table2 on condition1
..
inner join tableN on conditionN-1
inner join problematic_table on tableN.FKColumn= problematic_table.FKColumn
这会在 20-25 秒内产生结果。
如果我 运行 这样的查询,它 运行 会更快。在 100 毫秒内
select count(*)
from problematic_table where problematic_table.FKColumn in (
select distinct tableN.FKColumn
From table1
inner join table2 on condition1
..
inner join tableN on conditionN-1
)
我想指出从 table1 到 tableN 的表连接没有结果(为空)。
那么为什么第一种情况的性能那么差?
编辑:
当 运行ning EXPLAIN 时,表的排序顺序与我在 JOIN
中编写的顺序不同
EDIT2
所以对于第一个查询,problemati_table join并不是运行 last,而是真正将行数减少到0的查询是运行 last。
对于第二个查询,顺序相同,只是 problematic_table 位于顶部
id=1 和 select_type=Primary,其他是 id=2 和 select_type=MATERIALIZED。
所以我想问题变成了如何让引擎运行按照我写入的顺序进行查询?
EDIT3
可能的情况是,引擎最后 运行 的连接条件是 TABLE1 和 TABLE2,其格式为:
SELECT
FROM TABLE1
INNER JOIN TABLE2 on TABLE1.COLUMN1='constant_string' and TABLE2.COLUMN2='constant_string2'
INNER JOIN ... other tables have proper join conditions between colums of the tables.
EDIT4
更改了问题的标题以吸引可能面临相同问题的其他人。
问题是引擎 运行 顺序中的连接表现不佳。
我通过使用 STRAIGHT_JOIN
优化器提示而不是简单的 INNER JOIN
解决了这个问题
我有一个sql声明
SELECT count(*)
From table1
inner join table2 on condition1
..
inner join tableN on conditionN-1
inner join problematic_table on tableN.FKColumn= problematic_table.FKColumn
这会在 20-25 秒内产生结果。
如果我 运行 这样的查询,它 运行 会更快。在 100 毫秒内
select count(*)
from problematic_table where problematic_table.FKColumn in (
select distinct tableN.FKColumn
From table1
inner join table2 on condition1
..
inner join tableN on conditionN-1
)
我想指出从 table1 到 tableN 的表连接没有结果(为空)。
那么为什么第一种情况的性能那么差?
编辑: 当 运行ning EXPLAIN 时,表的排序顺序与我在 JOIN
中编写的顺序不同EDIT2 所以对于第一个查询,problemati_table join并不是运行 last,而是真正将行数减少到0的查询是运行 last。 对于第二个查询,顺序相同,只是 problematic_table 位于顶部 id=1 和 select_type=Primary,其他是 id=2 和 select_type=MATERIALIZED。
所以我想问题变成了如何让引擎运行按照我写入的顺序进行查询?
EDIT3
可能的情况是,引擎最后 运行 的连接条件是 TABLE1 和 TABLE2,其格式为:
SELECT
FROM TABLE1
INNER JOIN TABLE2 on TABLE1.COLUMN1='constant_string' and TABLE2.COLUMN2='constant_string2'
INNER JOIN ... other tables have proper join conditions between colums of the tables.
EDIT4 更改了问题的标题以吸引可能面临相同问题的其他人。
问题是引擎 运行 顺序中的连接表现不佳。
我通过使用 STRAIGHT_JOIN
优化器提示而不是简单的 INNER JOIN