mysql join关联查询需注意的问题

小编:啊南 448阅读 2020.11.20

1.能不能使用 join 语句?
  1. 如果可以使用 Index Nested-Loop Join 算法,也就是说可以用上被驱动表上的索引,其实是没问题的;
  2. 如果使用 Block Nested-Loop Join 算法,扫描行数就会过多。尤其是在大表上的 join 操作,这样可能要扫描被驱动表很多次,会占用大量的系统资源。所以这种 join 尽量不要用。
2. 如果要使用 join,应该选择大表做驱动表还是选择小表做驱动表?
  1. 如果是 Index Nested-Loop Join 算法,应该选择小表做驱动表;如果是 Block Nested-Loop Join 算法:
  2. 在 join_buffer_size 足够大的时候,是一样的;在 join_buffer_size 不够大的时候(这种情况更常见),应该选择小表做驱动表。
3. join优化
  1. 用小结果集驱动大结果集,尽量减少join语句中的Nested Loop的循环总次数;
  2. 优先优化Nested Loop的内层循环,因为内层循环是循环中执行次数最多的,每次循环提升很小的性能都能在整个循环中提升很大的性能;
  3. 对被驱动表的join字段上建立索引;
  4. 当被驱动表的join字段上无法建立索引的时候,设置足够的Join Buffer Size。
4. 什么是Join Buffer Size

什么是Join Buffer?

  1. Join Buffer会缓存所有参与查询的列而不是只有Join的列。
  2. 可以通过调整join_buffer_size缓存大小
  3. join_buffer_size的默认值是256K,join_buffer_size的最大值在MySQL 5.1.22版本前是4G-1,而之后的版本才能在64位操作系统下申请大于4G的Join Buffer空间。
  4. 使用Block Nested-Loop Join算法需要开启优化器管理配置的optimizer_switch的设置block_nested_loop为on,默认为开启。 在进行block_NEST_loop_join 算法的时候会将驱动表和 被驱动表查询到的数据放入到一个内存块中(JOIN buffer size) 其初始内存大小为256K 这个东西也可以进行设置)当查询到的数据比较打的时候会进行分块存储。
关联标签: