在公司干活一般使用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收费也不是没有道理的。不用做太多的配置。
自己干活就只能用小水管服务器。死扣细节做优化。 |