MySQL深度分页优化

5 篇文章 0 订阅
订阅专栏

Mysql深度分页优化

1. 背景

Mysql使用select * from table limit offset, rows分页在深度分页的情况下, 性能急剧下降。

  • 例如:select * 的情况下直接⽤limit 600000,10 扫描的是约60万条数据,并且是需要回表 60W次,也就是说⼤部分性能都耗在随机访问上,到头来只⽤到10条数据(总共取600010条数据只留10条记录)

2. 优化

2.1 业务层面限制跨度比较大的跳页

百度和Google方案:

分页方案

这样的话用户需要点很多次才能访问到页码比较大的数据,通过提高用户操作成本,降低了深分页请求数量。

2.2 记录每次取出的最大id, 然后where id > 最大id

select * from table_name where id > 最大id limit 10000, 10

这种方法适用于主键ID自增的情况,分布式ID则不行。需要考虑连续型字段datetime,sequence 等。
实现步骤:每一次查询把本批数据的最大ID传给前端,查询下一页的时候再带到后台。

2.3 通过in获取id

select * from table_name where id in (select id from table_name where userId = xxx  limit 10000, 10)

子查询先根据where条件分页查出一页id, 然后外层查询只需要回表查询返回这一页的数据行。大大降低了无效的数据回表次数。

2.4 上es

2.4.1 from,size浅分页

因为es是基于分片的,假设有5个分片,from=100,size=10。则会根据排序规则从5个分片中各取回100条数据数据,然后汇总成500条数据后选择最后面的10条数据。

2.4.2 scroll 深分页

from+size查询在10000-50000条数据(1000到5000页)以内的时候还是可以的,但是如果数据过多的话,就会出现深分页问题。

为了解决上面的问题,elasticsearch提出了一个scroll滚动的方式。
scroll 类似于sql中的cursor,使用scroll,每次只能获取一页的内容,然后会返回一个scroll_id。根据返回的这个scroll_id可以不断地获取下一页的内容,所以scroll并不适用于有跳页的情景。

2.4.3 search_after 深分页

scroll 的方式,官方的建议不用于实时的请求(一般用于数据导出),因为每一个 scroll_id 不仅会占用大量的资源,而且会生成历史快照,对于数据的变更不会反映到快照上。

search_after 分页的方式是根据上一页的最后一条数据来确定下一页的位置,同时在分页请求的过程中,如果有索引数据的增删改查,这些变更也会实时的反映到游标上。但是需要注意,因为每一页的数据依赖于上一页最后一条数据,所以无法跳页请求。

为了找到每一页最后一条数据,每个文档必须有一个全局唯一值,官方推荐使用 _uid 作为全局唯一值,其实使用业务层的 id 也可以。

本文内容合并了以下两篇文章,留作笔记。
详细请参考:

  1. Mysql使用limit深度分页优化
  2. Elasticsearch 三种分页方式
MySQL千万级大表深度分页为什么慢,以及优化的方法、原理
05-20
MySQL千万级大表深度分页为什么慢,以及优化的方法、原理 B站视频地址:https://www.bilibili.com/video/BV1ts4y1u7EK
MySQL索引实战二: 深度分页优化、join连接查询优化、in和exists优化、count(*)查询优化、阿里MySQL规范解读
沮丧的南瓜
05-22 2874
一、分页查询优化 很多时候我们业务系统实现分页功能可能会用如下sql实现: select * from employees limit 10000,10; 表示从表 employees 中取出从 10001 行开始的 10 行记录。看似只查询了 10 条记录,实际这条 SQL 是先读取 10010条记录,然后抛弃前 10000 条记录,然后读到后面 10 条想要的数据。因此要查询一张大表比较靠后的数据,执行效率是非常低的。这是典型的深度分页问题。 分页场景优化技巧 1、根据自增且连续的主键排序的分页查询
千万级数据深分页查询SQL性能优化实践
湖北太米网络科技有限公司
02-20 1516
千万级数据深分页查询SQL性能优化实践总结:​在本文中,我们详细研究了如何对千万级数据进行深分页查询SQL性能优化的实践方法。通过使用一些有效的技术手段和最佳实践,我们成功地改进了SQL查询的效率,并提高了系统的响应速度。​首先,我们深入了解了深分页查询的概念和挑战,并分析了常见的性能瓶颈。接着,我们提出了一系列的优化策略,包括使用索引、优化查询语句、合理设置缓存等。​在实践过程中,我们采用了一些实用的技巧,例如使用LIMIT子句、分页缓存等。
MySql深度分页查询优化
xiaoshitou_2015的博客
04-07 706
(订单表的情况也是类似的,只不过它的数据体量比客户表更大)。下面我们一起来测试一下,每次查询客户表时最多返回 100 条数据,不同的起始下,数据库查询性能的差异。
MySQL分页问题原理与三种解决方案
HollisChuang's Blog
05-08 718
1 深分页问题1.1 创建表CREATETABLE`player`( `id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主键', `player_id`varchar(256)NOTNULLCOMMENT'运动员编号', `player_name`varchar(256)NOTNULLCOMMENT'运动员名称'...
查询效率提升10倍!3种优化方案,帮你解决MySQL分页问题
chuixue24的博客
04-20 880
开发经常遇到分页查询的需求,但是当翻页过多的时候,就会产生深分页,导致查询效率急剧下降。有没有什么办法,能解决深分页的问题呢?本文总结了三种优化方案,查询直接效率提升10倍,一起学习一下。先创建一张用户表,只在create_time字段上加索引: 然后往用户表中插入100万条测试数据,这里可以使用存储过程: 2. 验证深分页问题 每页10条,当我们查询第一页的时候,速度很快: 在不到0.01秒内直接返回了,所以没显示出执行时间。当我们翻到第10000页的时候,查询效率急剧下降: 执行时间变
MySQL深度分页
Hello World
05-08 2657
深度分页问题的本质是在 MySQL 数据库中,通过 LIMIT 和 OFFSET 关键字进行分页时,MySQL 需要在每次查询时扫描整张表,直到找到当前页的数据。这种查询方式需要进行大量的磁盘 I/O 和内存操作,导致查询效率非常低下。当我们每次查询的记录数很小,但是查询次数很多时,就会产生大量的 I/O 操作,严重影响查询效率。例如有个sql假设假如 LIMIT 和 OFFSET 关键字同时进行使用的话,limit语句会先扫描offset+n行,然后再丢弃掉前offset行,返回后n行数据。
MySQL-深度分页如何优化
子悠のziyou
02-26 1073
延迟关联的优化思路,跟子查询的优化思路其实是一样的:都是把条件转移到主键索引树,然后减少回表。先查询出所需要的数据的主键id,因为在非聚集索引中每个叶子节点记录的数据为其id,这样就不需要回表查询,然后再去主键索引中查询。根据业务实际需求,看能否替换为上一页,下一页的功能,这样子就可以通过和上次数据进行比较,搭上树分支过滤的快车。深度分页造成的结果,offset越来越大,回表的记录越来越多,SQL查询性能急剧下降,会出现大量的慢SQL。直接通过主键索引查找,省略了二级索引查找过程,性能更高。
MySQL千万级数据深度分页优化
qq_36748747的博客
05-28 2455
看完此篇文章,你可以对MySQL深度分页有着深刻的理解 itlg出品,必出精品 1.准备工作 1.1建表 #创建一个存储名称的表,因为我是使用mysql8.0版本,所以bigint无需指定长度 CREATE TABLE `tb_name` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, ...
深度分页问题分析和优化
huhu123444的博客
03-12 7206
目录数据集深度分页存在的问题深度分页优化 数据集 test_db下载 :https://gitee.com/lzjcnb/test_db 数据集安装:mysql -uroot -p -t < employees.sql 深度分页存在的问题 查询表employess表结果集中第[N,N+m]跳记录,先查看下数据集大小: 分别查询[10000,10003]三条记录和[100000,100003]三条记录,并观察执行时间。 mysql> select * from employees limit 1
优化mysql的limit offset的例子
12-15
假设所有分页的页面访问频率一样,这样的查询平均扫描表的一半数据。优化的方法,要么限制访问后面的页数,要么提升高偏移的查询效率。  一个简单的优化办法是使用覆盖查询(covering index)查询,然后再跟全行的...
云优CMS企业网站管理系统 v2.0.2 分站版.zip
07-06
模板分离:模板程序分离,深度二次开发 三网合一:电脑/手机/微信 多终端访问 自定义广告:图片/文字/动画 定时发布:SEO维护,无需人工值守 多词生成:栏目关键词多方案生成 SEO设置:自定义URL/关键字 商业...
(全)传智播客PHP就业班视频完整课程
10-30
10-20 8 smarty分页技术 10-20 9 10-22 1 ajax介绍 无刷新验证用户名 10-22 2 ajax如何处理xml格式返回数据 10-22 3 json 10-22 4 ajax如何处理json格式返回数据 10-22 5 ajax应用 省市联动 10-22 6 ajax应用 黄金...
史上最全韩顺平传智播客PHP就业班视频,10月份全集
03-26
10-20 8 smarty分页技术 10-20 9 10-22 1 ajax介绍 无刷新验证用户名 10-22 2 ajax如何处理xml格式返回数据 10-22 3 json 10-22 4 ajax如何处理json格式返回数据 10-22 5 ajax应用 省市联动 10-22 6 ajax应用 黄金...
基于springboot+vue+Mysql的幼儿园管理系统
老卓爱爪哇 的博客
05-04 570
本系统采用的数据库Mysql,使用SpringBoot框架开发,运行环境使用Tomcat服务器,ECLIPSE 是本系统的开发平台。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 管理员登录成功后进入到系统操作界面,可以对首页、个人中心、用户管理、教师管理、幼儿信息管理、班级信息管理、工作日志管理、会议记录管理、待办事项管理、职工考核管理、请假信息管理、缴费信息管理、幼儿请假管理、儿童体检管理、资源信息管理、原料信
MySQL 实战 45 讲』20 - 幻读是什么,幻读有什么问题?
最新发布
Gavinjou大笨象的博客
05-04 527
3. 当执行 select * from t where d=5 for update 的时候,6 个记录加上了行锁,还同时加了 7 个间隙锁,这样就确保无法再插入新的记录。
MySQL —— 表的基本操作
学习C++的小陈同学
04-30 391
本篇整理了和表结构相关的各种基本操作(增删查改等等)
MySQL 之 主从复制
我见青山多妩媚,料青山见我应如是
04-28 556
复制是指将主数据库的DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行,从而使得从库和主库的数据保持同步。MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。
mysql 深度分页优化
05-13
以下是一些优化MySQL深度分页的方法: 1. 利用索引:为分页查询中用到的列建立索引,可以大大提高查询效率。 2. 避免使用子查询:子查询会导致查询效率低下,尤其是在深度分页时。可以使用JOIN代替子查询。 3. ...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • cap分析zk是cp还是ap 7063
  • MySQL深度分页优化 6723
  • Git本次修改合并到上次提交 5565
  • token在前端保存的安全性思考 4329
  • HashMap深度解释推导 4316

分类专栏

  • MySql 5篇
  • 并发编程 1篇
  • 算法 1篇
  • 中间件 3篇
  • 连接池
  • Git 2篇
  • 操作系统 2篇
  • 登录 1篇
  • 开发工具 3篇
  • 多线程 1篇
  • linux 1篇
  • 架构 1篇
  • Java运维 1篇
  • 登录流程 1篇
  • 笔记
  • HTTP 1篇
  • 工具类库 1篇
  • JSON 1篇
  • Mybatis 1篇

最新评论

  • 缓存穿透解决方案和最佳实践(注解+AOP)

    JavaMa-: lock()锁死了, tryLock只尝试一次

  • cap分析zk是cp还是ap

    qq_36818410: 不用阻塞等待全部follwer同步完,也要等半数以上同步完呀,这其实就是cp呀

  • JWT单点登录的三种解决方案

    四月不见春: JWT得目的本来就是将用户信息保存到客户端本地,每次请求的时候携带。往redis中存放的是jwt全量还是标识呢

  • token在前端保存的安全性思考

    黄er6: 请问前端存取cookie时怎么设置httpOnly呢?

  • 缓存穿透解决方案和最佳实践(注解+AOP)

    神秘人加1: 为啥那里不能用lock.lock()呢?

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 缓存穿透解决方案和最佳实践(注解+AOP)
  • win系统查看端口占用并kill
  • mysql大字段设计的思考
2022年2篇
2021年2篇
2020年25篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司迁安网站制作报价桐城网络营销价格宁德seo哪家好和县seo优化公司廊坊阿里店铺托管公司怀化网络广告推广推荐湘西关键词排名包年推广报价滁州外贸网站设计多少钱巴中外贸网站建设多少钱韶关网站推广推荐龙华模板推广哪家好眉山seo网站优化推荐贵港网站seo优化哪家好邢台百搜标王推荐厦门模板网站建设哪家好襄樊营销网站价格遵义高端网站设计公司果洛网站改版价格赤峰外贸网站建设哪家好海西至尊标王哪家好驻马店网站建设嘉兴模板推广庆阳SEO按天扣费价格石家庄百度seo多少钱南昌网站推广方案多少钱营口网页制作价格保定优化承德网站推广公司海南网站开发朔州营销型网站建设价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化