• 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;

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

  • 相关阅读:
    制作完整的java可执行文件
    做最好的自己
    hadoop安装&单机配置
    虚拟机中不能识别U盘的解决方案
    扩展的欧几里得&中国剩余定理
    Java基础知识
    [转载] vim+ctags+taglist+cscope+cppcomplete+global
    [转载] tar 备份时如何保持权限
    [转载] Python没有switch语句的解决方法
    Makefile中一些特殊符号的意义
  • 原文地址:https://www.cnblogs.com/codeAB/p/6391607.html
Copyright © 2020-2023  润新知