针对MySql百万级数据的分页(Limit/offset)性能低下问题解决方案总结

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: limit分页优化方案

注:本篇不考虑索引相关优化!只考虑limit分页优化。

传统分页:limit 、 offset

语句一:

select*from test_t limit11,10;

语句二:

MySql官方描述:

为了兼容PostgreSQL,MySQL 也支持 limit offset

如:

select*from test_t limit10 offset 11;

以上两种方式会随着表数据量的增加性能会急剧下降。


关于MySQL limit 优化相关的官方文档解读

一,查询总行数的另一种方法

查询分页的总行数,我们一般情况下是使用的, select count(*)
去实现的。文档中介绍了另外一种方式,通过 select FOUND_ROWS();
语句,不过这种方式的需要修改获取limit 数据的SQL 。例如:如果在SQL中同时执行这两条语句,就可以分别获取到分页的数据和分页总行数。

# 这个SQL 比平时的分页SQL 多了 SQL_CALC_FOUND_ROWS 修饰

SELECT SQL_CALC_FOUND_ROWS  id,`name` FROM `d_common_all_select_info` ORDER BY `name` LIMIT 0,10;

# 这条SQL返回的为总行数,不过统计方式与select count(*) 有些不同,另外需要与上面的SQL 同时执行

SELECT FOUND_ROWS();


二,查询的order by 的顺序问题

如果order by 中包含相同的值,则order by出来的结果不一定每次一样,它返回的顺序与总体执行计划有关。例如,带limit 和不带limit的order by 语句,返回顺序不一样的。

所以如果order by 的列包含相同值的时候,保证每次都是相同的结果,最好在最后的加上id列(这里假设自增id列名为id)。例如:平常要order by dt
的,然后dt中会包含相同值的最好修改为 order by dt,id

优化方案一:延迟关联

步骤:

  1. 先按照条件分页查询出主键ID(下面的字查询)。
  2. 然后根据主键ID去关联表,查询出所有需要列的记录数。(这样可以避免扫描太多的数据页)


SELECT SQL_NO_CACHE  a.*FROM `table_test` a,(SELECT id FROM table_test ORDERBY id LIMIT600000,10) b 
WHERE a.id=b.idORDERBY a.id;

优化方案二:书签记录(id分页)

书签记录:指我们可以用一个临时变量来存储上一次取数记录的位置,然后在获取下一页的时候,可以根据这个值,来获取大于这个值的下一页记录(上一页类似),直接从该值以后开始扫描。

例如:假设我们上一次获取到了分页 limit 100000,10 的记录,最大的值的id为 188888
(这里的值作为了一个书签记录),则我们获取 limit 100001,10 的记录可以这样写:

注:一般接口会多定义几个字段,方便于sql的查询:

  • 本页的最后一条记录ID
  • 本页的第一天记录ID
  • 是否是上一页操作
SELECT SQL_NO_CACHE  *FROM `table_test`  where id>188888ORDERBY id  LIMIT10;


总结

性能:书签记录   >   延迟关联    >    传统limit

局限性:

  1. 书签记录:只适合只有上一页、下一页操作的功能场景,如app端上划、下划操作,但跳页操作不支持。
  2. 延迟关联:业务场景广泛。跳页、只有上下页场景都支持。推荐使用。
  3. 传统limit:数据量达百万级,性能下降明显,不推荐。
相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
7月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
483 158
|
7月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
493 156
|
7月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
593 161
|
11月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
9月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
446 0
|
8月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
584 10
|
10月前
|
关系型数据库 MySQL 分布式数据库
Super MySQL|揭秘PolarDB全异步执行架构,高并发场景性能利器
阿里云瑶池旗下的云原生数据库PolarDB MySQL版设计了基于协程的全异步执行架构,实现鉴权、事务提交、锁等待等核心逻辑的异步化执行,这是业界首个真正意义上实现全异步执行架构的MySQL数据库产品,显著提升了PolarDB MySQL的高并发处理能力,其中通用写入性能提升超过70%,长尾延迟降低60%以上。
|
8月前
|
缓存 关系型数据库 MySQL
MySQL数据库性能调优:实用技术与策略
通过秉持以上的策略实施具体的优化措施,可以确保MySQL数据库的高效稳定运行。务必结合具体情况,动态调整优化策略,才能充分发挥数据库的性能潜力。
305 0
|
9月前
|
SQL 存储 缓存
MySQL 如何高效可靠处理持久化数据
本文详细解析了 MySQL 的 SQL 执行流程、crash-safe 机制及性能优化策略。内容涵盖连接器、分析器、优化器、执行器与存储引擎的工作原理,深入探讨 redolog 与 binlog 的两阶段提交机制,并分析日志策略、组提交、脏页刷盘等关键性能优化手段,帮助提升数据库稳定性与执行效率。
223 0
|
11月前
|
存储 SQL 缓存
mysql数据引擎有哪些
MySQL 提供了多种存储引擎,每种引擎都有其独特的特点和适用场景。以下是一些常见的 MySQL 存储引擎及其特点:
278 0

推荐镜像

更多