您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

mysql优化实战:千万级数据表如何进行分页查询?

时间:2019-10-11 09:47:00  来源:  作者:

上次在MySQL8上导入一个1000万数据之后,今天就想验证看看mysql对于单表大数据的分页的表现情况,并探讨一下单表大数据分页的优化思路。

mysql优化实战:千万级数据表如何进行分页查询?

 


测试环境

简单说明下测试环境。

  • mysql版本:8.0.17
  • 在test测试数据库中新增一个表t_user,字段为ID和NAME。其中在ID字段设置索引,且name值不同。
  • 导入1千万条数据,之前有部分测试数据,最后数据量为10000000,见如下图:
mysql优化实战:千万级数据表如何进行分页查询?

 

传统的分页查询

一般开发人员对于web分页的解决方案是使用limit子句来完成,语法为:

limit n,m

对于小规模数据应用来讲,可能并不会有大问题,在一定程度上还是比较有效率的,但是如果在大数据应用来讲,它的效率就可能很低了,因为它是全表扫描,数据越往后,即ID越大,数据越慢,例如下面的例子

select * from t_user LIMIT 90000 ,100 ##耗时 1秒
select * from t_user LIMIT 900000 ,100 ##耗时 2秒
select * from t_user LIMIT 9000000 ,100 ##耗时 6秒

耗时依次增加。

因为我们字段比较少,所以可能执行起来没想象中的慢,我们可以用执行计划来验证一下

explain select * from t_user LIMIT 1000000 ,100
mysql优化实战:千万级数据表如何进行分页查询?

 

从结果看出执行全表扫描,所以如果只取前面几条,则还是比较容易,如果是取相对靠后的数据,则全表扫描对数据库压力时非常大,特别web应用并发查询,则很容易造成数据库响应慢。

优化思路1

很明显,既然做全表扫描引起效率低下,那么我们第一印象肯定想办法是不是不走全表扫描。可以这么做,先在索引ID上完成分页操作,然后再根据ID关联回去。查询代码更新如下:

1.索引ID完成分页

select id from t_user order by id limit 9000000,100

2.最后完成自关联,最终SQL如下:

select * from t_user a inner join (select id from t_user order by id limit 9000000,100) b on a.id = b.id

3.看看执行计划,可见已经没有再全表扫描,这种方式是减少扫描来提高分页效率。

最终执行时间为3秒,效率提高一倍。

mysql优化实战:千万级数据表如何进行分页查询?

 

优化思路2

使用子查询进行优化,原理是通过子句先定位查询起始ID值,然后再通过主查询语句的ID往后查询,此方法适用ID排序的情况。举例如下:

select * from t_user where 
id>=(select id from t_user limit 9000000,1) 
limit 100;

通过执行计划查看,它也属于非全表扫描,所以效率同第一种优化方案

mysql优化实战:千万级数据表如何进行分页查询?

 

优化思路3

把LIMIT 查询转换成某个位置的查询,此思路需要和应用开发进行结合,不是单纯的数据库优化,因为我们实现的是web的分页查询,所以是可以通过页面的现实记录数和当前页,计算出该页的ID范围,我们拼出以下SQL

select * from t_user where id between 9000000 and 9000100 limit 100;

耗时只需0.4豪秒,是非常快速的查询,也是我们在生产中最常见的一种实现方法。

mysql优化实战:千万级数据表如何进行分页查询?

 

总结

优化方案2和优化3其实都是把LIMIT m,n转换成 limit n的查询,适合排序字段唯一的情况,当然大部分场景我们的排序字段都会选主键ID,这样操作的确能减轻分页的压力。理论上,几千万数据在mysql8上还是可以支撑的。

如果在数据量更大的情况下,这几种方案都无法满足了,一般我们得在数据库层和应用层之间设置缓存数据库,再执行分页查询。



Tags:mysql优化   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其...【详细内容】
2021-04-06  Tags: mysql优化  点击:(232)  评论:(0)  加入收藏
前言我最近由于换工作,博客更新暂缓,后面争取一周两篇。Mysql 系列到这里就差不多了,Mysql集群、分库分表及分布式事务由于我还是停留在理论上,没在生产环境上玩过,又怕写不好,这...【详细内容】
2021-03-25  Tags: mysql优化  点击:(224)  评论:(0)  加入收藏
刚参加工作的我们,都以为使用 MySQL 是非常的简单的,无非都是照着 【select from where group by order by】 这个格式套来套去;从来不会关注 SQL 的耗费时长,更不会关注查询的...【详细内容】
2020-05-09  Tags: mysql优化  点击:(52)  评论:(0)  加入收藏
一、概述1. 为什么要优化 一个应用吞吐量瓶颈往往出现在数据库的处理速度上 随着应用程序的使用,数据库数据逐渐增多,数据库处理压力逐渐增大 关系型数据库的数据是存放在...【详细内容】
2020-01-13  Tags: mysql优化  点击:(57)  评论:(0)  加入收藏
首先采用Mysql存储千亿级的数据,确实是一项非常大的挑战。Mysql单表确实可以存储10亿级的数据,只是这个时候性能非常差,项目中大量的实验证明,Mysql单表容量在500万左右,性能处于...【详细内容】
2019-11-11  Tags: mysql优化  点击:(94)  评论:(0)  加入收藏
说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?...【详细内容】
2019-10-16  Tags: mysql优化  点击:(108)  评论:(0)  加入收藏
上次在mysql8上导入一个1000万数据之后,今天就想验证看看mysql对于单表大数据的分页的表现情况,并探讨一下单表大数据分页的优化思路。 测试环境简单说明下测试环境。 mysql版...【详细内容】
2019-10-11  Tags: mysql优化  点击:(254)  评论:(0)  加入收藏
作者:zhangqhsegmentfault.com/a/1190000012155267 一、EXPLAIN做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据...【详细内容】
2019-08-21  Tags: mysql优化  点击:(199)  评论:(0)  加入收藏
在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已。 图-MySQL查询过程一、优...【详细内容】
2019-08-14  Tags: mysql优化  点击:(173)  评论:(0)  加入收藏
应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然...【详细内容】
2019-07-11  Tags: mysql优化  点击:(329)  评论:(0)  加入收藏
▌简易百科推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  爱可生    Tags:MySQL   点击:(7)  评论:(0)  加入收藏
生成间隙(gap)锁、临键(next-key)锁的前提条件 是在 RR 隔离级别下。有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章...【详细内容】
2021-12-14  python数据分析    Tags:MySQL记录锁   点击:(18)  评论:(0)  加入收藏
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二...【详细内容】
2021-12-14  linux上的码农    Tags:mysql   点击:(13)  评论:(0)  加入收藏
为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查...【详细内容】
2021-12-09  元宇宙iwemeta    Tags:mysql   点击:(15)  评论:(0)  加入收藏
测试的目的和原因,公司有很多程序员,每个程序员对数据库和表结构都有自己的理解。而且每个程序员的理解往往是以效率考虑。既然都是为了效率考虑,那么我就来测试一下究竟哪种使...【详细内容】
2021-12-08  吴彬的分享    Tags:Mysql数据库   点击:(14)  评论:(0)  加入收藏
当你们考虑项目并发的时候,我在部署环境,当你们在纠结使用ArrayList还是LinkedArrayList的时候,我还是在部署环境。所以啊,技术不止境,我在部环境。今天这篇文章缕一下在同一台服...【详细内容】
2021-12-08  秃头码哥    Tags:MySQL数据库   点击:(17)  评论:(0)  加入收藏
对于数据分析来说,MySQL使用最多的是查询,比如对数据进行排序、分组、去重、汇总及字符串匹配等,如果查询的数据涉及多个表,还需要要对表进行连接,本文就来说说MySQL中常用的查询...【详细内容】
2021-12-06  笨鸟学数据分析    Tags:MySQL   点击:(21)  评论:(0)  加入收藏
在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL Server等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。...【详细内容】
2021-11-24  笨鸟学数据分析    Tags:SQL语句   点击:(23)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Java云海    Tags:分布式锁   点击:(32)  评论:(0)  加入收藏
MySQL的进阶查询 一、 按关键字排序 使用ORDERBY语句来实现排序排序可针对一个或多个字段ASC:升序,默认排序方式 【升序是从小到大】DESC:降序 【降序是从大到小】ORDER BY的...【详细内容】
2021-11-05  Java热点    Tags:SQL语句   点击:(28)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条