zoukankan      html  css  js  c++  java
  • 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收费也不是没有道理的。不用做太多的配置。

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

  • 相关阅读:
    log4j.appender.stdout.layout.ConversionPattern
    log4j:WARN No appenders could be found for logger
    Eclipse中TODO的分类,以及自动去除
    Java泛型类型擦除导致的类型转换问题
    Java中泛型数组的使用
    Java泛型中的通配符的使用
    Java泛型类定义,与泛型方法的定义使用
    Java泛型的类型擦除
    jQuery查询性能考虑
    jQuery判断checkbox是否选中
  • 原文地址:https://www.cnblogs.com/boxrice/p/11670571.html
Copyright © 2011-2022 走看看