• MySQL深度分页


     

    假设有一个千万量级的表,取1到10条数据;

    select * from table limit 0,10;
    

    select * from table limit 1000,10;

    这两条语句查询时间应该在毫秒级完成;

    select * from table limit 3000000,10;

    你可能没想到,这条语句执行之间在5s左右;

    为什么相差这么大?

    可能mysql并没有你想的那么智能,比如你要查询 300w开始后面10条数据;mysql会读取300w加10条这么多的数据,只不过 过滤后返回最后10条而已!!!

    那么如果解决这个问题呢;这里总结三种常用方法;

    第一种简单粗暴,就是不允许查看这么靠后的数据,比如百度就是这样的

    最多翻到76页就不让你翻了,这种方式就是从业务上解决;

    第二种方法,在查询下一页时把上一页的行id作为参数传递给客户端程序,然后sql就改成了

    select * from table where id>3000000 limit 10;

    这条语句执行也是在毫秒级完成的,id>300w其实就是让mysql直接跳到这里了,不用依次在扫描全面所有的行

    如果你的table的主键id是自增的,并且中间没有删除和断点,那么还有一种方式,比如100页的10条数据

    select * from table where id>100*10 limit 10;

    最后第三种方法:延迟关联

    我们在来分析一下这条语句为什么慢,慢在哪里。

    select * from table limit 3000000,10;

    玄机就处在这个 * 里面,这个表除了id主键肯定还有其他字段  比如 name  age  之类的,因为select  *  所以mysql在沿着id主键走的时候要回行拿数据,走一下拿一下数据;

    如果把语句改成 

    select id from table limit 3000000,10;

    你会发现时间缩短了一半;然后我们在拿id分别去取10条数据就行了;

    语句就改成这样了:

    select table.* from table inner join ( select id from table limit 3000000,10 ) as tmp on tmp.id=table.id;

    这三种方法最先考虑第一种 其次第二种,第三种是别无选择

    转:https://blog.csdn.net/qq_22771739/article/details/82773205

  • 相关阅读:
    window/body/img/iframe 的onload事件
    程序员考证之信息系统项目管理师
    程序员转项目管理之考证PMP
    2018第29周总结
    小程序行业报告学习
    谷歌中国的第一款产品“猜画小歌”
    小程序学习资料
    月薪3万Java程序员要达到的技术层次
    SOA、微服务与服务网格
    不重视管理会给软件开发带来哪些恶果
  • 原文地址:https://www.cnblogs.com/651434092qq/p/14253516.html
Copyright © 2020-2023  润新知