mysql-如何强制更改内部连接的求值顺序?

4dbbbstv  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(290)

我有两张table:tableA和tableB。在对这些表进行简单的内部连接时,

SELECT *
FROM tableA 
JOIN tableB
ON tableA.columnA = tableB.id

现在, tableA 包含29000多行,而 tableB 仅包含11000多行。 tableB.id 是主键,因此是群集的。存在一个非聚集索引 columnA .
根据我的想法,查询优化器应该 tableB 作为执行联接时的内部表,因为它的行数较少,所以将 tableA 作为外部表,因为需要从中筛选很多行 tableA 基于 tableB.id 列。
但是,事实上恰恰相反。出于某种原因,查询优化器正在处理 tableA 作为内桌和 tableB 作为外桌。
有人能解释一下为什么会这样,我在思考过程中犯了什么错误吗?另外,有没有一种方法可以强制取代查询优化器的决策,并命令它进行处理 tableB 作为内桌?我只是想看看同一个查询的两个不同执行是如何相互比较的。谢谢。

webghufk

webghufk1#

在innodb中,主键索引查找的效率略高于次索引查找。优化器可能更喜欢运行针对 tableB.id 因为它使用主键索引。
如果要覆盖优化器对表重新排序的功能,可以使用优化器提示。这些表将按照您在查询中指定的顺序进行访问。

SELECT *
FROM tableA 
STRAIGHT_JOIN tableB
ON tableA.columnA = tableB.id

这种语法应该适用于任何当前支持的mysql版本。
这将使您有机会使用任意一个表顺序对查询进行计时,并查看哪一个实际上运行得更快。
mysql 8.0中还有一个新语法,用于指定具有更大控制的连接顺序:https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html#optimizer-提示连接顺序

相关问题