为什么Mysql在加入另一个表B时对表a使用全表扫描?
我有一个表a和一个表B。我从表a中选择信息,其中我只需要表a中的信息,其中表B连接表a。我对连接的列和where子句进行索引 这是选择代码:为什么Mysql在加入另一个表B时对表a使用全表扫描?,mysql,join,left-join,inner-join,Mysql,Join,Left Join,Inner Join,我有一个表a和一个表B。我从表a中选择信息,其中我只需要表a中的信息,其中表B连接表a。我对连接的列和where子句进行索引 这是选择代码: SELECT * FROM tableA INNER JOIN tableB AS tableB ON tableB.id = tableA.id AND tableB.type = 'car' 当我使用explain时,我可以看到mysql正在对tableA中的所有行进行全表扫描。此外,它还正确地使用索引连接tableB 所以Mysql似乎正在扫描t
SELECT *
FROM tableA
INNER JOIN tableB AS tableB
ON tableB.id = tableA.id
AND tableB.type = 'car'
当我使用explain时,我可以看到mysql正在对tableA中的所有行进行全表扫描。此外,它还正确地使用索引连接tableB
所以Mysql似乎正在扫描talbeA中的所有行,看看是否与tableB匹配。然而,由于我在这两个表的id上都有索引,所以我不希望出现tablescan。因为我的表有50000行,所以这个查询需要几秒钟的时间(这对于我的应用程序来说实在太长了)
这就是解释:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE tableA ALL tableA.id NULL NULL 49898
1 SIMPLE tableB eq_ref tableB.type tableB.type 4 1 Use WHere
我的问题:我如何优化此查询和索引,以便Mysql直接从tableA中选择与tableB匹配的行,而不扫描talbeA中的所有行?这是连接查询可以得到的最大优化 向她询问更多细节
您可以将解释结果添加到问题中吗?但如果您执行“从表格a中选择*”,您还有一个完整的扫描,因为您没有设置任何where条件来限制表格a的内容。@NODATA发现这是正确的,但我想要从表格a中获取的数据受表格a匹配位置的限制。所以我只想从表a中得到与表B匹配的信息。所以WHERE条件应该是tableB连接到的任何地方。@JoachimIsaksson看到更新的question@BastiaanWW解释是否真的针对整个连接,而不仅仅是从表A中选择*?它至少应该提到执行计划。