博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql limit分页查询优化写法
阅读量:7169 次
发布时间:2019-06-29

本文共 1294 字,大约阅读时间需要 4 分钟。

  hot3.png

在mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用orderby排 序。但是在表数据量比较大的时候,例如查询语句片段limit 10000, 20,数据库会读取10020条数据,然后把前10000条丢弃,把最后的20条返回给你,这种消耗是可以避免的,也是没必要的。下边介绍几种优化方法:
  优化方法1(让分页操作在索引中进行):
  一般表中经常作为条件查询的列都会建立索引,例如如下查询
  Sql代码
  SELECT msg_id, msg_content FROM message ORDER BY gmt_create desc LIMIT 100, 20;
  可以写成如下方式
  Sql代码
  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是建立索引的列,而且你也知道要查询的时间范围,这样你就可以通过如下查询语句:
  Sql代码
  SELECT msg_id, msg_content FROM message
  WHERE gmt_create BETWEEN #startTime# AND #endTime#
  ORDER BY gmt_create desc
  这样数据库通过一个范围查询就可以得到想要的数据。
  优化方法3(OFFSET作为查询条件显式指定)
  例子还是如上,我们可以在查询参数中显式指定一个查询时间,叫做lastVisitTime吧。我们查询第一页可以用如下语句:
  Sql代码
  SELECT msg_id, msg_content FROM message
  ORDER BY gmt_create desc
  LIMIT 20
  我们把读出来的数据的最后一条数据的gmt_create字段记录在lastVisitTime字段中,那么后边页的查询就可以用如下语句实现:
  Sql代码
  SELECT msg_id, msg_content FROM message
  WHERE gmt_create < #lastVisitTime#
  ORDER BY gmt_create desc
  LIMIT 20;
  这种查询方式,无论你查询多少页,分页都不会是影响效率的因素。

转载于:https://my.oschina.net/004/blog/156327

你可能感兴趣的文章
EditText会自动获取焦点并弹出输入法的问题
查看>>
知识体系
查看>>
jquery把表单数据序列成json,支持多维数组
查看>>
virtualbox mac-debian共享文件夹
查看>>
[转载]当web配置文件 appSettings配置的东西越来越多时,可以拆开了
查看>>
int *i = new int;
查看>>
CCF计算机认证——字符串匹配问题(运行都正确,为什么提交后只给50分?)...
查看>>
POST提交的四种类型
查看>>
DataTable转List<T>
查看>>
安卓项目开发
查看>>
使用C#把发表的时间改为几个月,几天前,几小时前,几分钟前,或几秒前
查看>>
2019-06-11 Java学习日记之Bootstrap
查看>>
解决apache 443端口被占用
查看>>
PHP中PDO错误/异常(PDOException)处理
查看>>
中国科学院大学生创新实践训练计划-
查看>>
洛谷——P1294 高手去散步
查看>>
python正则表达式
查看>>
Blob写入文件
查看>>
Again Stone Game
查看>>
MySQL 5.7.9修改root密码以及新特性
查看>>