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收费也不是没有道理的。不用做太多的配置。
自己干活就只能用小水管服务器。死扣细节做优化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端