【问题标题】:Why does Mysql use a full table scan for table A when joining another table B?为什么Mysql在加入另一个表B时对表A使用全表扫描?
【发布时间】:2014-07-28 13:40:14
【问题描述】:

我有一个表 A 和一个表 B。我从表 A 中选择信息,我只需要表 A 中的信息,其中表 B 连接表 A。我在联合列和 WHERE 子句上有索引。

这是选择代码:

SELECT *
FROM tableA

INNER JOIN tableB AS tableB
ON tableB.id = tableA.id
AND tableB.type = 'car'

当我使用解释时,我可以看到 mysql 正在对 tableA 中的所有行使用全表扫描。此外,它正确使用索引来连接 tableB。

所以 Mysql 似乎在做的是扫描 talbeA 中的所有行以查看是否与 tableB 匹配。但是,由于我对两个表的 id 都有索引,因此我不希望进行表扫描。因为我的表有 50.000 行,所以这个查询需要几秒钟(这对我的应用程序来说真的太长了)。

这是解释:

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 中的所有行?

【问题讨论】:

  • 能否将解释结果添加到问题中?
  • 但是我你做了一个“select * from tableA”,你也有一个全扫描,因为你没有放任何 where 条件来限制 tableA 的内容。
  • @NoDataFound 没错,但是我想从表 A 中获取的数据受到表 A 匹配的位置的限制。所以我只想要来自 tableA 的信息,只要与 tableB 匹配。所以 WHERE 条件将是 tableB 加入的任何地方。
  • @JoachimIsaksson 查看更新后的问题
  • @BastiaanWW 解释真的是针对整个联接而不仅仅是SELECT * FROM tableA?至少应该提到tableBa'la执行计划here

标签: mysql join left-join inner-join


【解决方案1】:

这是 JOIN 查询可以获得的最大优化 推荐她了解更多详情 https://cryptkcoding.com/blog/2012/04/06/how-to-optimize-mysql-join-queries-through-indexing/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2013-09-10
    • 2015-01-25
    相关资源
    最近更新 更多