分页查询优化及join关联查询优化

萨瓦迪卡3个月前 (08-22)MySql696

一、分页查询优化

比如:
mysql> select * from employees limit 10000,10;
表示从表 employees 中取出从 10001 行开始的 10 行记录。看似只查询了 10 条记录,实际这条 SQL 是先读取 10010
条记录,然后抛弃前 10000 条记录,然后读到后面 10 条想要的数据。因此要查询一张大表比较靠后的数据,执行效率是非常低的。
1、根据自增且连续主键排序的分页查询
mysql> select * from employees limit 90000,5;
可改成:
mysql> select * from employees where id > 90000 limit 5;
2、根据非主键字段排序的分页查询
mysql> select * from employees ORDER BY name limit 90000,5;


d6ab198f-3100-4885-88a4-6e8a15b2531d.png

没走name字段的索引,扫描整个索引并查找到没索引的行(可能要遍历多个索引树)的成本比扫描全表的成本更高,所以优化器放弃使用索引
可以优化为(其实关键是让排序时返回的字段尽可能少,可以只查主键,根据主键查对应的记录):

mysql> select * from employees e inner join (select id from employees order by name limit 90000,5) ed on e.id = ed.id;

01e05b0e-44c1-4697-88a5-8286b7b68dff.png

原 SQL 使用的是 filesort 排序,而优化后的 SQL 使用的是索引排序,且走了索引。

二、join关联查询优化

mysql的表关联常见有两种算法
Nested-Loop Join 算法
Block Nested-Loop Join 算法
1、 嵌套循环连接 Nested-Loop Join(NLJ) 算法
一次一行循环地从第一张表(称为驱动表)中读取行,在这行数据中取到关联字段,根据关联字段在另一张表(被驱动
)里取出满足条件的行,然后取出两张表的结果合集。
mysql> EXPLAIN select * from t1 inner join t2 on t1.a= t2.a;

51a2aa4c-eea4-44d5-9b0e-90125195fa33.png

从执行计划可见:
驱动表是 t2,被驱动表是 t1。先执行的就是驱动表(执行计划结果的id如果一样则按从上到下顺序执行sql);优
化器一般会优先选择小表做驱动表所以使用 inner join 时,排在前面的表并不一定就是驱动表。
当使用left join时,左表是驱动表,右表是被驱动表,当使用right join时,右表时驱动表,左表是被驱动表,
当使用join时,mysql会选择数据量比较小的表作为驱动表,大表作为被驱动表。
使用了 NLJ算法。一般 join 语句中,如果执行计划 Extra 中未出现 Using join buffer 则表示使用的 join 算法是 NLJ。
上面sql的大致流程如下:
   1. 从表 t2 中读取一行数据(如果t2表有查询过滤条件的,会从过滤结果里取出一行数据);
   2. 从第 1 步的数据中,取出关联字段 a,到表 t1 中查找;
   3. 取出表 t1 中满足条件的行,跟 t2 中获取到的结果合并,作为结果返回给客户端;
   4. 重复上面 3 步。
整个过程会读取 t2 表的所有数据(扫描100行),然后遍历这每行数据中字段 a 的值,根据 t2 表中 a 的值索引扫描 t1 表
中的对应行(扫描100次 t1 表的索引,1次扫描可以认为最终只扫描 t1 表一行完整数据,也就是总共 t1 表也扫描了100
)。因此整个过程扫描了 200 行
如果被驱动表的关联字段没索引,使用NLJ算法性能会比较低(下面有详细解释),mysql会选择Block Nested-Loop Join
算法。
2、 基于块的嵌套循环连接 Block Nested-Loop Join(BNL)算法
驱动表的数据读入到 join_buffer 中,然后扫描被驱动表,把被驱动表每一行取出来跟 join_buffer 中的数据做对比。
mysql>EXPLAIN select * from t1 inner join t2 on t1.b= t2.b;
Extra 中 的Using join buffer (Block Nested Loop)说明该关联查询使用的是 BNL 算法。
上面sql的大致流程如下:
1. 把 t2 的所有数据放入到内存 join_buffer 中。
2. 把表 t1 中每一行取出来,跟 join_buffer 中的数据做对比

3. 返回满足 join 条件的数据

a6dbbd94-9963-465b-bb19-81254f0397a5.png

整个过程对表 t1(10000条数据) 和 t2(比如100表数据) 都做了一次全表扫描,因此扫描的总行数为10000(表 t1 的数据总量) + 100(表 t2 的数据总量) =
10100。并且 join_buffer 里的数据是无序的,因此对表 t1 中的每一行,都要做 100 次判断,所以内存中的判断次数是
100 * 10000= 100 万次
这个例子里表 t2 才 100 行,要是表 t2 是一个大表,join_buffer 放不下怎么办呢?
join_buffer 的大小是由参数 join_buffer_size 设定的,默认值是 256k。如果放不下表 t2 的所有数据话,策略很简单,就是分段放
比如 t2 表有1000行记录, join_buffer 一次只能放800行数据,那么执行过程就是先往 join_buffer 里放800行记录,然
后从 t1 表里取数据跟 join_buffer 中数据对比得到部分结果,然后清空 join_buffer ,再放入 t2 表剩余200行记录,再次从 t1 表里取数据跟 join_buffer 中数据对比。所以就多扫了一次 t1 表。


被驱动表的关联字段没索引为什么要选择使用 BNL 算法而不使用 Nested-Loop Join 呢?

如果上面第二条sql使用 Nested-Loop Join,那么扫描行数为 100 * 10000 = 100万次,这个是磁盘扫描
很显然,用BNL磁盘扫描次数少很多,相比于磁盘扫描,BNL的内存计算会快得多。
因此MySQL对于被驱动表的关联字段没索引的关联查询,一般都会使用 BNL 算法。如果有索引一般选择 NLJ 算法,有
索引的情况下 NLJ 算法比 BNL算法性能更高

对于关联sql的优化

    关联字段加索引(尤其大表字段一定要加索引),让mysql做join操作时尽量选择NLJ算法
    小表驱动大表,写多表连接sql时如果明确知道哪张表是小表可以用straight_join写法固定连接驱动方式,省去mysql优化器自己判断的时间
straight_join解释:straight_join功能同join类似,但能让左边的表来驱动右边的表,能改表优化器对于联表查询的执行顺序。
比如:
select * from t2 straight_join t1 on t2.a = t1.a;
代表指定mysql选着 t2 表作为驱动表。
straight_join只适用于inner join,并不适用于left join,right join。(因为left join,right join已经代表指定了表的执行顺序)
尽可能让优化器去判断,因为大部分情况下mysql优化器是比人要聪明的。使用straight_join一定要慎重,因为部分情况下人为指定的执行顺序并不一定会比优化引擎要靠谱。


本文原创,转载必追究版权。

分享给朋友:

相关文章

MyEclipse10.7注册码生成

注意经验里的工具可能不可用,请点击 生成注册码工具  下载。提取码:p1w4MyEclipse10.7注册码激活步骤:点击下面的链接http://jingyan.baidu.com/arti...

jquery 操作html元素(及CSS)

jquery 操作html元素(及CSS)

 $("li").addClass("aui-user-view-cell aui-img") ;  //给元素添加样式$('#a1...

开机密码忘记怎么办

1、重新启动计算机,在启动画面出现后马上按下F8键(不同类型型号电脑启动键不一样,参考附加),选择“带命令行的安全模式”。2、运行过程结束时,系统列出了系统超级用户“administrator”和本地...

Java 实现用户资料完整度的前端显示(或根据填写资料自动评分)

前端使用 Bootstrap 的进度条组件显示百分比,后台读取权重并计算信息完整度,并将计算的结果返回给前端,供页面显示。CSS1<link href="static/sc/...

dwz+jfinal 市县下拉菜单二级联动(实例)

在DWZ文档中对组合框combox的是这样描述的:在传统的select 用class 定义:class=”combox”, html 扩展:保留原有属性name,  增加了属性:ref。re...

office 2010安装、激活、激活工具下载

office 2010安装、激活、激活工具下载

 首先下载好工具包(包括office 2010安装程序、激活工具及Microsoft .NET Framework 4.0),点击工具包下载进行下载;安装好office 2010。如果是wi...

评论列表

免费电影
1个月前 (10-17)

青春不在了,青春痘还在!https://www.2kdy.com

2K影院
1个月前 (10-17)

十分赞同楼主!https://www.2kdy.com

2K影视
1个月前 (10-19)

楼主的帖子实在是写得太好了。文笔流畅,修辞得体!https://www.2kdy.com

2K影视
1个月前 (10-21)

收藏了,很不错的内容!https://www.2kdy.com

2K影院
1个月前 (10-21)

好无聊啊!https://www.2kdy.com

2K电影
1个月前 (10-25)

好好学习楼主的帖子!https://www.2kdy.com

免费电影
1个月前 (10-26)

帖子好乱!https://www.2kdy.com

2K电影网
1个月前 (10-27)

楼主练了葵花宝典吧?https://www.2kdy.com

2K影视
1个月前 (10-29)

小弟默默的路过贵宝地~~~https://www.2kdy.com

2K电影
4周前 (11-01)

今天的心情很不错啊https://www.2kdy.com

免费电影
4周前 (11-02)

很有看点!https://www.2kdy.com

香蕉影院
4周前 (11-02)

我和我的小伙伴都惊呆了!https://www.xjtv1.com

2K影院
4周前 (11-03)

楼上的说的很多!https://www.2kdy.com

香蕉影视
3周前 (11-05)

很有看点!https://www.xjtv1.com

2K影院
3周前 (11-05)

精华帖的节奏啊!https://www.2kdy.com

香蕉电影
3周前 (11-06)

大神好强大!https://www.xjtv1.com

2K电影网
2周前 (11-13)

太邪乎了吧?https://www.2kdy.com

TRX能量租赁
2周前 (11-15)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
2周前 (11-15)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

2K电影
2周前 (11-15)

写的太好啦,评论一个https://www.2kdy.com

TRX能量租赁
2周前 (11-16)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
2周前 (11-17)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
2周前 (11-18)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
2周前 (11-18)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
2周前 (11-19)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
1周前 (11-19)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
1周前 (11-19)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
1周前 (11-19)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

免费电影
1周前 (11-20)

楼上的别说的那么悲观好吧!https://www.2kdy.com

365短剧网
1周前 (11-20)

楼主好聪明啊!https://www.365duanju.com

2K电影
1周前 (11-20)

楼上的能详细介绍一下么?https://www.2kdy.com

TRX能量租赁
1周前 (11-20)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

365网剧
1周前 (11-21)

感谢楼主的推荐!https://www.365duanju.com

TRX能量租赁
1周前 (11-21)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

2K影院
1周前 (11-22)

楼上的心情不错啊!https://www.2kdy.com

TRX能量租赁
1周前 (11-22)

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

365网剧
7天前

支持一个https://www.365duanju.com

TRX能量租赁
6天前

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

免费电影
6天前

刚分手,心情不好!https://www.2kdy.com

心理器材
6天前

顶!顶!顶!https://aptlawfirm.com/

TRX能量租赁
5天前

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
5天前

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

心理咨询室设备厂家

青春不在了,青春痘还在!https://aptlawfirm.com/

TRX能量租赁
5天前

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
4天前

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
4天前

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

2K影视
3天前

被楼主的逻辑打败了!https://www.2kdy.com

2K电影
1天前

顶一下,收藏了!https://www.2kdy.com

TRX能量租赁
1天前

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
1天前

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

TRX能量租赁
21小时前

TRX能量租赁 - 0.8TRX=13万能量 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 0.8 TRX即可0手续费转账!TG机器人频道:@xingtahttps://www.23123.top/

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。