应用经常会出现一些两表(或多表)join的操作需求,MySQL在完成某些join需求的时候(all row join/all index /scan join)为了减少参与join的“被驱动表”的读取次数以提高性能,需要使用到join buffer来协助完成join操作当join buffer 太小,MySQL不会将该buffer存入磁盘文件而是先将join buffer中的结果与需求join的表进行操作,然后清空join buffer中的数据,继续将剩余的结果集写入次buffer中,如此往复,这势必会造成被驱动表需要被多次读取,成倍增加IO访问,降低效率(执行计划中如果现实using join buffer

两个表关联的时候 减少参与被驱动表的join操作(没办法有效利用索引的时候)

多表join时,就需要用到join buffer的三种情况

All row join do not user indexes nad thus perform full table scans(没有索引的全表扫描)

All index join  plain index scans(普通索引扫描)

Range index scan join=rangeindex scans(范围索引扫描)

最好是添加适当的索引而不是纯粹加大join_buffer_size

任何来个表间的全表join就会分配一次join_buffer也就是说,如果3个表join就会分配2joinbuffer(而不是一个session只分配一次)

Logo

更多推荐