【发布时间】:2018-12-17 19:55:12
【问题描述】:
所以,我有这两个表:tableA 和 tableB。在对这些表进行简单的内部连接后,
SELECT *
FROM tableA
JOIN tableB
ON tableA.columnA = tableB.id
现在,tableA 包含 29000+ 行,而 tableB 仅包含 11000+ 行。 tableB.id 是主键,因此是聚集的。 columnA 上存在一个非聚集索引。
根据我的想法,查询优化器在执行连接时应该将tableB视为内表,因为它的行数较少,而将tableA视为外表,因为很多行需要根据tableB.id 列的值从tableA 中过滤。
但是,事实恰恰相反。出于某种原因,查询优化器将tableA 视为内部表,将tableB 视为外部表。
谁能解释一下为什么会发生这种情况以及我在思考过程中犯了什么错误?此外,有没有办法强制取代查询优化器的决定并指示将tableB 视为内表?我只是想知道同一查询的两个不同执行如何相互比较。谢谢。
【问题讨论】:
-
请注意,内部联接中没有“内部”表,内部描述了正在建立的联接类型。
-
您应该考虑服务器对这些表中数据的索引统计。在某些情况下,如果根据统计信息这样做没有意义,服务器可能会决定根本不使用索引。
-
请对minimal reproducible example采取行动,包括提供 DDL 和 EXPLAIN 输出。阅读 MySQL 手册重新索引和优化中的所有内容,包括 statistics。当您使用 STRAIGHT JOIN 以两种方式运行查询时发生了什么? PS“我在思考过程中犯的错误”是认为一个不知情的猜测是相关的。要开始了解自己,请阅读您正在使用的每个功能的精美手册。那么你用 site:Stack Overflow & with site:Database Administrators 谷歌搜索告诉你什么?请参阅How to Ask 和投票箭头鼠标悬停文本。
标签: mysql query-optimization inner-join mysql-workbench