博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql 分页offset过大性能问题解决思路
阅读量:5332 次
发布时间:2019-06-15

本文共 1027 字,大约阅读时间需要 3 分钟。

在公司干活一般使用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收费也不是没有道理的。不用做太多的配置。

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

转载于:https://www.cnblogs.com/feimaoicoding/p/10878726.html

你可能感兴趣的文章
AndroidArchitecture
查看>>
安装Endnote X6,但Word插件显示的总是Endnote Web"解决办法
查看>>
python全栈 计算机硬件管理 —— 硬件
查看>>
大数据学习
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
Recover Binary Search Tree
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
各种正则验证
查看>>
观察者模式(Observer)
查看>>
python中numpy.r_和numpy.c_
查看>>
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
freebsd 实现 tab 命令 补全 命令 提示
查看>>
struts1和struts2的区别
查看>>
函数之匿名函数
查看>>