zoukankan      html  css  js  c++  java
  • 【开发笔记】- MySQL中limit查询超级慢,怎么办?

    有如下解决方法:

    (1)、通过判断id的范围来分页

    select  id,LOG_CREATE_TIME,LOG_OPERATED_TYPE from LOG where id>5000000 limit 10;
    也得到了分页的数据,但是我们发现如果id不是顺序的,也就是如果有数据删除过的话,那么这样分页数据就会不正确,这个是有缺陷的。

    (2)、通过between  and 代替limit(前提:知道具体的位置)

    (3)、通过连接查询来分页

    我们可以先查询500w条数据开始分页的那10个id,然后通过连接查询显示数据
    select id,LOG_CREATE_TIME,LOG_OPERATED_TYPE from LOG inner join(select id from LOG  limit 5000000,10)as lim using(id);
     
    优化分页查询的一个最简单的方法就是尽可能地使用索引覆盖扫描,而不是查询所有的列。然后根据需要做一次关联操作再返回所需的列。对于偏移量很大的时候,这样做的效率会提升非常大。
     
    例如,有如下查询:
     
    select id,LOG_WHO,LOG_CREATE_TIME,LOG_OPERATED_TYPE from LOG order by LOG_CREATE_TIME limit 5000000,10;
     
    注:LOG_CREATE_TIME有一个btree索引
     

    改写后的性能

    select id,LOG_WHO,LOG_CREATE_TIME,LOG_OPERATED_TYPE from LOG inner join(select id from LOG order by LOG_CREATE_TIME limit 5000000,10)as lim using(id);
     
    这里的“延迟关联”将大大提升查询效率,它让mysql扫描尽可能少的页面,获取需要访问的记录后在根据关联列回原表查询需要的所有列,这个技术也可以用于优化关联查询中的limit子句。
  • 相关阅读:
    动态类型
    unlink与close关系
    Google 历年笔试面试30题
    UNIX网络编程 卷2 源代码使用
    centos安装telnet
    python中安装第三方模块
    Linux平台 Oracle 18c RAC安装Part1:准备工作
    RHEL7 配置iSCSI模拟环境
    Solaris 10主机名和IP地址步骤
    设置sqlplus不显示除查询结果外的信息
  • 原文地址:https://www.cnblogs.com/juihai/p/11969477.html
Copyright © 2011-2022 走看看