在具有一对多关系的表上进行一对一左联接的最快方法(MySQL)

模糊树

我有两个表具有一对多的关系,我正在进行1:1左联接。该查询返回了正确的结果,但显示在我的慢速查询日志中(最多需要5秒)。有没有更好的方法来编写此查询?

select * from
tablea a left join tableb b 
  on a.tablea_id = b.tablea_id
  and b.tableb_id = (select max(tableb_id) from tableb b2 where b2.tablea_id = a.tablea_id)

即我想TableA离开加入TableB最大的一排tableb_id

TableA
tablea_id
1
2

TableB
tableb_id, tablea_id, data
1, 1, x
2, 1, y

Expected Result
tablea_id, tableb_id, data
1, 2, y
2, null, null

TableA的索引为,tablea_id而TableB的索引为tablea_id,tableb_id

解释输出

+----+--------------------+---------------+--------+-----------------+---------------+---------+----------------------+-------+-------------+
| id | select_type        | table         | type   | possible_keys   | key           | key_len | ref                  | rows  | Extra       |
+----+--------------------+---------------+--------+-----------------+---------------+---------+----------------------+-------+-------------+
|  1 | PRIMARY            | c             | index  | NULL            | department_id | 4       | NULL                 | 18966 | Using index |
|  1 | PRIMARY            | recent_cv_lut | eq_ref | PRIMARY,case_id | PRIMARY       | 4       | func                 |     1 |             |
|  2 | DEPENDENT SUBQUERY | cases_visits  | ref    | case_id         | case_id       | 4       | abcd_records_v2.c.id |     2 | Using index |
+----+--------------------+---------------+--------+-----------------+---------------+---------+----------------------+-------+-------------+
spencer7593

可能,相关的子查询正在针对tableb中的每一行执行。

(没有EXPLAIN的输出,我们实际上只是在猜测是否有合适的索引,以及MySQL是否正在使用它们。)

使用内联视图查询,一次获得每个tablea_id的最大tableb_id值,然后使用联接操作,可能会更有效。像这样:

SELECT a.*
     , b.*
  FROM tablea a
  LEFT
  JOIN ( SELECT n.tablea_id
              , MAX(n.tableb_id) AS max_tableb_id
           FROM tableb n
          GROUP
             BY n.tablea_id
       ) m
    ON m.tablea_id = a.tablea_id
  LEFT
  JOIN tableb b
    ON b.tablea_id = m.tablea_id
   AND b.tableb_id = m.max_tableb_id

这是另一种选择,但是不能保证速度会更快。实际上,这取决于我们没有任何信息的全部负载。(行数,基数,数据类型,可用索引等)


编辑

或者,我们可以在内联视图中进行tablea和tableb之间的联接。这可能会提高性能。(再次,这实际上取决于很多我们没有任何信息的事情。)

SELECT m.tablea_id
     , m.foo
     , b.*
  FROM ( SELECT a.tablea_id
              , a.foo
              , MAX(n.tableb_id) AS max_tableb_id
           FROM tablea a
           LEFT
           JOIN tableb n ON n.tablea_id = a.tablea_id
          GROUP
             BY a.tablea_id
       ) m
  LEFT
  JOIN tableb b
    ON b.tablea_id = m.tablea_id
   AND b.tableb_id = m.max_tableb_id

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

创建具有一对多关系的mysql表

来自分类Dev

如何为一列设计具有一对一或一对多关系的数据库?

来自分类Dev

具有相同反向访问器的同一模型的一对一和一对多关系

来自分类Dev

如何为一列设计具有一对一或一对多关系的数据库?

来自分类Dev

具有一对多关系的HasManyThrough

来自分类Dev

如何在Android中具有一对一或一对多关系的对象化实体中插入记录

来自分类Dev

如何在Android中具有一对一或一对多关系的对象化实体中插入记录

来自分类Dev

MySQL一对多关系,具有共享价值

来自分类Dev

一对多关系表

来自分类Dev

如何基于一对一(三个表)创建一对多关系?

来自分类Dev

MySQL与一对多关系

来自分类Dev

使用INTERLEAVE表进行一对一关系

来自分类Dev

MySQL:一对一关系表合并

来自分类Dev

MYSQL一对一关系

来自分类Dev

MySQL,选择具有许多一对多关系的条目的最佳方法?

来自分类Dev

Laravel:belongsTo()关系假定一对多关系,而不是一对一关系

来自分类Dev

同一张2表之间的一对一和一对多关系

来自分类Dev

SQL内部联接中具有一对多关系的结果重复

来自分类Dev

使用现有联接表的一对多关联

来自分类Dev

使用现有联接表的一对多关联

来自分类Dev

通过一对多关系表仅选择具有最大字段的一行

来自分类Dev

SQLAlchemy核心从(0..1)一对一关系中的联接表中进行选择会引发歧义名称InvalidRequestError

来自分类Dev

SQL一对一关系联接

来自分类Dev

SQLite表之间的一对多关系

来自分类Dev

以一对多关系连接多个表

来自分类Dev

具有一对多关系的Django Form

来自分类Dev

具有一对多关系的jooq单查询

来自分类Dev

与Postgres具有一对多关系的SQL聚合查询

来自分类Dev

与具有多行的fk建立一对多关系

Related 相关文章

  1. 1

    创建具有一对多关系的mysql表

  2. 2

    如何为一列设计具有一对一或一对多关系的数据库?

  3. 3

    具有相同反向访问器的同一模型的一对一和一对多关系

  4. 4

    如何为一列设计具有一对一或一对多关系的数据库?

  5. 5

    具有一对多关系的HasManyThrough

  6. 6

    如何在Android中具有一对一或一对多关系的对象化实体中插入记录

  7. 7

    如何在Android中具有一对一或一对多关系的对象化实体中插入记录

  8. 8

    MySQL一对多关系,具有共享价值

  9. 9

    一对多关系表

  10. 10

    如何基于一对一(三个表)创建一对多关系?

  11. 11

    MySQL与一对多关系

  12. 12

    使用INTERLEAVE表进行一对一关系

  13. 13

    MySQL:一对一关系表合并

  14. 14

    MYSQL一对一关系

  15. 15

    MySQL,选择具有许多一对多关系的条目的最佳方法?

  16. 16

    Laravel:belongsTo()关系假定一对多关系,而不是一对一关系

  17. 17

    同一张2表之间的一对一和一对多关系

  18. 18

    SQL内部联接中具有一对多关系的结果重复

  19. 19

    使用现有联接表的一对多关联

  20. 20

    使用现有联接表的一对多关联

  21. 21

    通过一对多关系表仅选择具有最大字段的一行

  22. 22

    SQLAlchemy核心从(0..1)一对一关系中的联接表中进行选择会引发歧义名称InvalidRequestError

  23. 23

    SQL一对一关系联接

  24. 24

    SQLite表之间的一对多关系

  25. 25

    以一对多关系连接多个表

  26. 26

    具有一对多关系的Django Form

  27. 27

    具有一对多关系的jooq单查询

  28. 28

    与Postgres具有一对多关系的SQL聚合查询

  29. 29

    与具有多行的fk建立一对多关系

热门标签

归档