• mysql 大数据量分页优化


    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;

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

  • 相关阅读:
    Windows 10 字体替换
    Windows 任务栏增加秒显示
    CCProxy v8.0 代理服务器
    Git RPM软件包 && 源码包
    Google Chrome 浏览器最新版本 71.0.3578.98(正式版本) (64 位)
    Linux 查询公网出口IP
    Windows 10 Enterprise LTSC做Windows To Go蓝屏无法进入系统
    Nginx编译./configure翻译
    Windows 10 快捷键
    JDBC连接MySQL
  • 原文地址:https://www.cnblogs.com/zox2011/p/7822777.html
Copyright © 2020-2023  润新知