• MySQL中的翻页优化和延迟缓存


    limit offset,N 当offset非常大时,效率极低。 

    原因是:mysql并不是跳过offset行,然后单取N行。而是取offset+N行。

    返回时,放弃前offset行,返回N行。效率较低,当offset越大是,效率越低。

    优化方式:

    1. 非技术手段限制分页,比如百度翻页一般不会超过70页,谷歌不会超过40页。

    // 计算总的记录数
    $total = ...
    // 定义每页显示数量
    $perpage  = 10;
    // 计算总的页数
    $pagecount  = min(ceil($total/$perpage),70);

    2. 不用offset,用条件查询。

    $sql = "select * from user limit 10,10";
    // 转换成
    $sql = "select * from user where id>10 limit 10";

    缺点:如果数据有被删除,则取出的数据结果会不一致。

    解决方案:

    数据不进行物理删除(可逻辑删除)最终在页面上显示数据时,逻辑删除的条目不显示即可。

    一般来说,大网站的数据都是不物理删除的,只做逻辑删除,比如is_delete=1

    3. 如果非要物理删除,还要用offset精确查询,还不限制用户分页,怎么办?

    我们现在必须要查,则只查索引,不查数据,得到id,再用id去查具体条目,这种技巧就是延迟索引。 

    第一步:取出数据的id

    $sql = "select * from user limit 10000,10"; // 没有用到索引
    // 转换成
    $sql = "select id from user limit 10000,10"; // 用到索引覆盖

    第二步:根据取出id再查具体的数据,因为使用id查询比较快,因为id是主键。

    因此使用一个连接查询,就可以,我们使用内连接。inner join / left join / right join

  • 相关阅读:
    用TPLINK 无线网卡设置无线工作环境
    ChartDirector与JFreeChart两款主要web图表工具调研报告
    发现奇怪的问题,TOMCAT居然跟本机网卡的DNS设置有关
    解决Oracle监听器服务不能启动的问题
    JAVA 调用 .NET写的WEBSERVICE
    Windows Forms 实现安全的多线程详解
    异步调用与多线程
    关于.NET异步调用的初步总结
    c#中的多线程同步
    WinForm界面开发
  • 原文地址:https://www.cnblogs.com/chenjiacheng/p/6628353.html
Copyright © 2020-2023  润新知