mysql 分页offset过大性能问题解决思路

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS SQL Server,独享型 2核4GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
简介: mysql 分页offset过大性能问题解决思路

在公司干活一般使用sqlserver数据库。rownumber分页贼好用。

但是晚上下班搞自己的事情就不用sqlserver了。原因就是自己的渣渣1核2g的小服务器完全扛不住sqlserver那么大的大块头,于是就使用Mysql数据库。

一般使用MySQL分页都是使用limit,我也这么使用的。

今天晚上打开一个服务器上的小网站,顺便点几下看看有没有问题,不小心点到了最后一页,卡了我近10秒才反应过来。我数据库就7w多条数据。虽说服务器垃圾也不至于卡这么久吧。。

然后把分页的sql找出来,去数据库手动执行。发现确实越往后翻页越慢,翻到四万多条的时候,都好几秒才响应了。这完全无法接受啊。难怪最近网站的搜索引擎权重又降低了。。5555

分页sql如下

select id ,title,time from table where type = ‘xxx’ ORDER BY createtime limit 10 offset 45000

因为Id是主键,我尝试去掉了title和time字段,马上就秒开了。

查看数据库执行计划,索引是已经命中了。但是为什么还是很卡呢?

查阅了不少资料,得出两个结论

1.服务器实在是太垃圾了。

2.limit x offset x 分页确实有性能问题,据说阿里的dba都不太建议offset太多。。。

解决方案:

既然都无法使用offset,那就曲线救国。

既然Id很快,那就先按照Id排序做分页,查询出一页的Id,然后join当前表 id和Id关联。

SELECT q.id, p.title, p.createtime from(
SELECT id from tablewhere type = @type ORDER BY createtime limit @size OFFSET @offset
) q JOIN tablep on q.id = p.id

 

然后使用新的这条sql,去数据库查询,直接就从10秒+降到了0.02秒的样子。

并且继续往后翻页也不会有什么太大的性能问题。就先凑合到这里了。

好怀念工地的服务器。上百G的内存随便挥霍。几百万上千万的量都不咋优化,都跑的飞快。sqlserver收费也不是没有道理的。不用做太多的配置。

自己干活就只能用小水管服务器。死扣细节做优化。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
关系型数据库 MySQL
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-01
【4月更文挑战第18天】MySQL的InnoDB引擎支持行锁,而MyISAM只支持表锁。行锁在事务开始时添加,事务结束时释放,遵循两阶段锁协议。为减少锁冲突影响并发,应将可能导致最大冲突的锁操作放在事务最后。例如,在电影票交易中,应将更新影院账户余额的操作安排在事务末尾,以缩短锁住关键行的时间,提高系统并发性能。
27 4
|
10天前
|
SQL 关系型数据库 MySQL
MySQL性能调优办法
MySQL性能调优办法
|
12天前
|
缓存 关系型数据库 MySQL
|
12天前
|
存储 SQL 关系型数据库
关系型数据库mysql的性能与灵活性
【6月更文挑战第12天】关系型数据库mysql的性能与灵活性
191 1
|
16天前
|
缓存 关系型数据库 MySQL
如何优化MySQL 8.0的性能?
【6月更文挑战第14天】如何优化MySQL 8.0的性能?
60 5
|
2月前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
1天前
|
关系型数据库 MySQL 测试技术
《阿里云产品四月刊》—瑶池数据库微课堂|RDS MySQL 经济版 vs 自建 MySQL 性能压测与性价比分析
阿里云瑶池数据库云原生化和一体化产品能力升级,多款产品更新迭代
|
3天前
|
SQL 关系型数据库 MySQL
老程序员分享:MySQL性能调优的方法
老程序员分享:MySQL性能调优的方法
|
2月前
|
存储 SQL 关系型数据库
MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀
以小白的视角探究MySQL索引条件下推ICP的优化,其中包括server层与存储引擎层如何交互、索引、回表、ICP等内容
MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀
|
2月前
|
缓存 关系型数据库 MySQL
如何优化MySQL性能?
【5月更文挑战第23天】如何优化MySQL性能?
40 1