• 请不要在回答技术问题时复制粘贴 AI 生成的内容
biechuli
V2EX  ›  程序员

MySQL 的 inner join 顺序是否会影响最后查询的性能

  •  
  •   biechuli ·
    zshnb · Aug 2, 2022 · 3415 views
    This topic created in 1559 days ago, the information mentioned may be changed or developed.

    假设有表 a ( 100 条)表 b ( 50 条) 然后是以下 2 条 sql 语句

    select *
    from a
    inner join b
    ---
    select *
    from b
    inner join a
    

    对于上面 2 条 sql,最后执行的速度会有区别吗?我记得 MySQL 的 join 是 nested loop 实现的,个人感觉应该没有什么区别吧。

    12 replies  •  2022-08-05 14:37:06 +08:00
    F281M6Dh8DXpD1g2
    F281M6Dh8DXpD1g2
    Aug 2, 2022 via iPhone
    1
    不会
    7911364440
    7911364440
    Aug 3, 2022
    2
    用小表做驱动表可以减少被驱动表的访问次数,没有其他过滤条件的话还是 b 做驱动表好些
    zed1018
    zed1018
    Aug 3, 2022
    3
    8 以后有 hash join
    enjoychen0318
    enjoychen0318
    Aug 3, 2022
    4
    上面的两种写法,mysql 好像都会帮你优化成小表驱动大表的
    enjoychen0318
    enjoychen0318
    Aug 3, 2022
    5
    驱动表对执行速度的影响可以看丁奇《 mysql45 讲》的第 34 讲
    iXInbo
    iXInbo
    Aug 3, 2022
    6
    主要是小表驱动大表,如果反了可能会影响性能
    lazyfighter
    lazyfighter
    Aug 3, 2022
    7
    我觉得 mysql 没必要设计的这么 low ,优化器应该会优化的
    akagishigeru
    akagishigeru
    Aug 3, 2022
    8
    优化器回优化的,不用管
    biechuli
    biechuli
    OP
    Aug 3, 2022
    9
    @enjoychen0318
    @7911364440
    @iXInbo
    如果单纯是 inner join 的话,感觉驱动表大小不会影响最后的结果吧,nested loop join 下,外面 for50 次,里面 for100 次跟外面 for100 次,里面 for50 次在 cpu 运算上好像没有区别,在数据量比较小的例子下,io 层面也是一样的消耗
    iPisces77
    iPisces77
    Aug 4, 2022
    10
    优化器会优化,但还是要查一下执行计划
    iseki
    iseki
    Aug 4, 2022 via Android
    11
    现在数据库基本都是 CBO 的,查执行计划吧,猜有点困难呐
    iXInbo
    iXInbo
    Aug 5, 2022
    12
    一般这种优化都是次数上去了才会有明显的变化;比如外面 5000 次和 1000 次的对比,甚至几万几千万,
    可能原本几毫秒的差距会被放大成几秒和几十秒;
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4561 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 08:36 · PVG 16:36 · LAX 00:36 · JFK 03:36
    ♥ Do have faith in what you're doing.