我有两张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
作为内桌?我只是想看看同一个查询的两个不同执行是如何相互比较的。谢谢。
1条答案
按热度按时间xdyibdwo1#
在innodb中,主键索引查找的效率略高于次索引查找。优化器可能更喜欢运行针对
tableB.id
因为它使用主键索引。如果要覆盖优化器对表重新排序的功能,可以使用优化器提示。这些表将按照您在查询中指定的顺序进行访问。
这种语法应该适用于任何当前支持的mysql版本。
这将使您有机会使用任意一个表顺序对查询进行计时,并查看哪一个实际上运行得更快。
mysql 8.0中还有一个新语法,用于指定具有更大控制的连接顺序:https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html#optimizer-提示连接顺序