Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Mysql在加入另一个表B时对表a使用全表扫描?_Mysql_Join_Left Join_Inner Join - Fatal编程技术网

为什么Mysql在加入另一个表B时对表a使用全表扫描?

为什么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

我有一个表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似乎正在扫描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中选择*?它至少应该提到执行计划。