MySQL_Join优化

MySQL_Join优化

1. Simple Nested-Loop Join

  • r为驱动表,s为匹配表,可以看到从r中分别取出每一个记录区匹配s表的列,然后合并数据,对s表进行r表的行数次访问,对数据库开箱比较大

  • 建议小表驱动大表

2. Index Nested-Loop Join

  • 这个要求非驱动表(s)上有索引,可以通过索引来减少比较,加速查询。

  • 在查询时,驱动表(r)会根据关联字段的索引进行查找,当在索引上找到符合的值,再回表进行查询,也就是只有当匹配到索引以后才会进行回表查询。

  • 如果非驱动表(s)的关联键是主键的话,性能会非常高,如果不是主键的话,要进行多次回表查询,先关联索引,然后根据二级索引的主键ID进行回表操作,性能上比索引是主键要慢

3. Block Nested-Loop Join

如果有索引,会选取第二种方式进行join,但如果join列没有索引,就会采用Block Nested-Loop Join。可以看到中间有个join buffer缓冲区,是将驱动表的所有join相关的列都先缓存到join buffer中,然后批量于匹配表进行比配,将第一种多次比较合并为一次,降低了非驱动表(s)的访问频率。默认情况下join_buffer_size=256K,再查找的时候MySQL会将所有的需要的列缓存到join_buffer当中,包括select的列,而不是仅仅只缓存关联列。在一个有N个JOIN关联的SQL当中会在执行时候分配N-1个join_buffer。