• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    mysql分页性能探索

    常见的几种分页方式:

    1.扶梯方式

    扶梯方式在导航上通常只提供上一页/下一页这两种模式,部分产品甚至不提供上一页功能,只提供一种“更多/more”的方式,也有下拉自动加载更多的方式,在技术上都可以归纳成扶梯方式。
    扶梯方式在技术实现上比较简单及高效,根据当前页最后一条的偏移往后获取一页即可。写成SQL可能类似

    SELECT*FROMLIST_TABLEWHEREid> offset_id LIMIT n;

    1.电梯方式

    另外一种数据获取方式在产品上体现成精确的翻页方式,如1,2,3……n,同时在导航上也可以由用户输入直达n页。国内大部分场景采用电梯方式,但电梯方式在技术实现上相对成本较高。

    在MySQL中,通常提到的b-tree,在存储引擎实现上,通常都是b+tree。

    使用电梯方式时候,当用户指定翻到第n页时候,并没有直接方法寻址到该位置,而是需要从第一楼逐个count,scan到count*page时候,获取数据才真正开始,所以导致效率不高。

    传统分页技术(电梯方式)

    首先前端需要传给你的分页实体,以及查询条件

    //分页实体
    structFinanceDcPage{
    1:i32 pageSize,//页容量
    2:i32 pageIndex,//当前页索引
    }

    然后你需要返回查询总条数给前端;

    SELECTCOUNT(*)FROMmy_tableWHEREx= y ORDERBYid;

    然后再返回指定页面条数给前端:

    SELECT*FROMmy_tableWHEREx= y ORDERBYdate_colLIMIT (pageIndex - 1)* pageSize, pageSize;

    由上面两条sql语句查询出来的结果需要返回给前端的分页实体,以及单页结果集

    //分页实体
    structFinanceDcPage{
    1:i32 pageSize,//页容量
    2:i32 pageIndex,//当前页索引
    3:i32 pageTotal,//总页数
    4:i32 totalRecod,//总条数
    }

    传统查询方法,每次请求变化的只有pageIndex值,也就是limit offset,num的offset

    如limit 0,10; limit 10,10; …. limit10000,10;

    上面的变化会导致每次查询所执行的时间会有偏差,offset值越大需要的时间越长,如limit10000,10 需要读取10010个数据才能得到想要的10条数据。

    优化方法

    传统方法中我们了解到,影响效率的关键是程序遍历了许多不需要的数据,找到了关键点那么就从这里着手。

    如果没有必须使用电梯方式的时候,我们可以使用扶梯的方式,来提高性能。

    但是大多数情况,电梯形式更能满足用户的需求,所以我们就需要另找方法来优化电梯形式。

    基于传统方式的优化

    上面提到的优化方式,要么难以满足用户的需求,要么实现起来过于复杂,所以如果数据量不是特别大的时候,像百来万条数据,其实根本没有必要使用上面的优化方法。

    传统方法已经足够用了,只不过传统方法也可能需要优化的地方。例如:

    orderby优化

    SELECT*FROMpa_dc_flowORDERBYsubject_codeDESCLIMIT100000,5

    这条语句中使用了ORDERBY关键字,那么对什么进行排序又非常重要了,如果你是对自增id进行排序的话,那么这条语句就不需要优化了,如果是索引甚至非索引的话,那就需要优化了。

    首先你要保证它是索引,不然真的会很慢。然后如果他是索引,但是本身不像自增id那样有序的话,那么就要改写成下面的语句。

    SELECT*FROMpa_dc_flowINNERJOIN(SELECTidFROMpa_dc_flowORDERBYsubject_codeDESCLIMIT100000,5)ASpa_dc_flow_idUSING(id);

    下面是对两条sql的 EXPLAIN


    由图中我们可以看出,第二个sql可以少扫面很多页面。

    其实这涉及到order by的优化问题,第一条sql中并没有利用到subject_code索引。如果你改为select subject_code …则用到了索引。下面是对order by的优化。

    order by后的字段,如果要走索引,须与where 条件里的某字段建立复合索引!!或者说orcerby后的字段如果要走索引排序,它要么与where条件里的字段建立复合索引【这里建立复合索引的时候,需要注意复合索引的列顺序为(where字段,order by字段),这样才能满足最左列原则,原因可能是order by字段并能算在where 查询条件中!】,要么它自身要在where条件里被引用到!

    表asubject_code为普通字段,上面建有索引,id是自增主键

    select*fromaorderbysubject_code//用不上索引
    selectidfromaorderbysubject_code//能用上索引
    selectsubject_codefromaorderbysubject_code//能用上索引
    select*fromawheresubject_code= XX orderbysubject_code//能用上索引

    意思是说order by 要避免使用文件系统排序,要么把order by的字段出现在select后,要么使用order by字段出现在where 条件里,要么把order by字段与where条件字段建立复合索引!

    第二条sql就是巧妙的利用第二种方式利用上了索引。 select id from a order bysubject_code,这种方式

    count优化

    当数据量非常大时,其实可以输出总数的大概数据,利用explain语句,他并没有真正去执行sql,而是进行的估算。

    总结

    以上所述是小编给大家介绍的mysql分页性能探索,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

    您可能感兴趣的文章:
    • MySQL中聚合函数count的使用和性能优化技巧
    • mysql查询时offset过大影响性能的原因和优化详解
    • MySQL优化insert性能的方法示例
    • MySQL性能全面优化方法参考,从CPU,文件系统选择到mysql.cnf参数优化
    • 浅谈MySQL和MariaDB区别(mariadb和mysql的性能比较)
    • mysql千万级数据分页查询性能优化
    • MySQL批量SQL插入性能优化详解
    • MySQL几点重要的性能指标计算和优化方法总结
    • mysql中影响数据库性能的因素讲解
    上一篇:MySQL5.7.17安装及配置图文教程
    下一篇:winx64下mysql5.7.19的基本安装流程(详细)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    mysql分页性能探索 mysql,分页,性能,探索,mysql,