for (row1 : 驱动表) {
Index Nested-Loop Join Algorithms (索引嵌套循环连接算法)上面双重for循环的查询中,相信很多研发人员看到这种情况第一个想法就是性能问题,是的,join查询的优化思路就是小表驱动大表,而且在大表上创建索引(也就是被动表创建索引),如果驱动表创建了索引,MySQL是不会使用的
for (row2 : 被驱动表){
if (conidtion == true){
send client
}
}
}
for (row1 : 驱动表) {
Block Nested-Loop Join Algorithm(基于块的连接嵌套循环算法)其实很简单就是把一行变成了一批,块嵌套循环(BNL)嵌套算法使用对在外部循环中读取的行进行缓冲,以减少必须读取内部循环中的表的次数 。例如,如果将10行读入缓冲区并将缓冲区传递到下一个内部循环,则可以将内部循环中读取的每一行与缓冲区中的所有10行进行比较 。这将内部表必须读取的次数减少了一个数量级 。
索引在被驱动表中命中,不用再遍历被驱动表了
}
MySQL连接缓冲区大小通过这个参数控制 : join_buffer_size
MySQL连接缓冲区有一些特征,只有无法使用索引时才会使用连接缓冲区;联接中只有感兴趣的列存储在其联接缓冲区中,而不是整个行;为每个可以缓冲的连接分配一个缓冲区,因此可以使用多个连接缓冲区来处理给定查询;在执行连接之前分配连接缓冲区,并在查询完成后释放连接缓冲区
所以查询时最好不要把 * 作为查询的字段,而是需要什么字段查询什么字段,这样缓冲区能够缓冲足够多的行 。
从上面的执行计划中其实我们已经看到了 useing join buffer了,是的,那是因为我们对两张表都有创建索引
三种算法优先级第一种算法忽略,MySQL不会采用这种的,当我们对被驱动表创建了索引,那么MySQL一定使用的第二种算法,当我们没有创建索引或者对驱动表创建了索引,那么MySQL一定使用第三种算法
推荐阅读
- 千牛怎么查询客服业绩 千牛如何看客服的销售数据
- wifi连接上但上不了网怎么回事
- 为什么 MySQL 的自增主键不单调也不连续
- MySQL文件及目录权限设置分析-爱可生
- 支持数据连接池 分享一个简单的C#的通用DbHelper类
- 为什么别人能用好 MySQL?万字详解其复杂原理
- 苹果|苹果iPhone 14将支持卫星网络连接:关键时刻能救命
- 学会使用批量查询快递工具 快递单号怎么查
- MySQL大表优化方案——从单表优化到分表分库
- 一个接口查询关联了十几张表,响应速度太慢?怎么办?