zoukankan      html  css  js  c++  java
  • MySQL limit分页查询优化写法

      

      在mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用order by排序。但是在表数据量比较大的时候,例如查询语句片段limit 10000,20,数据库会读取10020条数据,然后把前10000条丢弃,把最后的20条返回给你,这种消耗是可以避免的,也是没必要的。

     下边介绍几种优化方法: 

    优化方法1:  让分页操作在索引中进行
      一般表中经常作为条件查询的列都会建立索引,例如如下查询:
       SELECT  msg_id,  msg_content  FROM message ORDER BY  gmt_create desc  LIMIT 100, 20;
      可以写成如下方式
       SELECT  msg_id, msg_content  FROM  message
         INNER JOIN (
          SELECT  msg_id FROM message
          ORDER BY  gmt_create  LIMIT 100, 20
        ) AS  page USING(msg_id);
       这样当前查询页的内容就只会在索引中进行,当得到当前页的msg_id再统一通过一个INNER JOIN得到最终要得到的数据详情,避免了对大量数据详情进行操作的消耗。当然JOIN操作也可以通过子查询实现,不过书中介绍5.6之前版本的 mysql相比子查询还是优先使用JOIN

    优化方法2: 显式指定要查询的索引列范围
      例如方法一中的gmt_create是建立索引的列,而且你也知道要查询的时间范围,这样你就可以通过如下查询语句:
      SELECT  msg_id, msg_content  FROM  message
      WHERE  gmt_create BETWEEN  #startTime# AND #endTime#
      ORDER  BY  gmt_create desc
      这样数据库通过一个范围查询就可以得到想要的数据。

    优化方法3:  OFFSET作为查询条件显式指定

      例子还是如上,我们可以在查询参数中显式指定一个查询时间,叫做lastVisitTime吧。我们查询第一页可以用如下语句:
       SELECT   msg_id, msg_content   FROM   message   ORDER BY   gmt_create   desc  LIMIT 20;

      我们把读出来的数据的最后一条数据的gmt_create字段记录在lastVisitTime字段中,那么后边页的查询就可以用如下语句实现:
       SELECT  msg_id, msg_content  FROM  message
       WHERE  gmt_create < #lastVisitTime#
       ORDER BY  gmt_create desc
       LIMIT  20;
      这种查询方式,无论你查询多少页,分页都不会是影响效率的因素。

  • 相关阅读:
    php二维数组指定下标排序
    laravel使用auth管理后台amdin数据表
    laravel插件
    laravel中Horizon简单介绍适合于redis操作队列
    laravel5.5或laravel5.7版本自定义日志记录
    laravel使用"tymon/jwt-auth": "0.5.*"
    larval5.7安装jwt使用
    ubuntu ibus 输入法总在左下角不跟随光标的处理
    Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier
    30种mysql优化sql语句查询的方法<转>
  • 原文地址:https://www.cnblogs.com/chy2055/p/5127749.html
Copyright © 2011-2022 走看看