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

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

 一、慢查询

假设我们有一个订单表,分页查询一条语句是这样的

SELECT * FROM table ORDER BY id LIMIT 1000, 10;

但当订单表数据达到了百万级,那么这样写会慢死

SELECT * FROM table ORDER BY id LIMIT 1000000, 10;

上面这条语句有可能花费几十秒.

我们看到,随着记录的增多,limit语句的查询时间与起始记录的位置成正比增长。

因为LIMIT 100000,10的意思扫描满足条件的100010行,扔掉前面的100000行,返回最后的10行,问题就在这里。这种分页查询方式每次都会从数据库第一条记录开始扫描,所以越往后,查询速度越慢。

而我们解决的方法,就可以从上次已经查到的最大记录开始。

二、使用子查询优化

先定位偏移位置的 id,然后往后查询,这种方式适用于 id 递增的情况:

select * from order  limit 100000,1;select id from order limit 100000,1;select * from order where id>=(select id from orders limit 100000,1) limit 100

3条语句的查询时间如下:

  • 第1条语句:3674ms
  • 第2条语句:1315ms
  • 第3条语句:1327ms

针对上面的查询需要注意:

  • 比较第1条语句和第2条语句:使用 select id 代替 select * 速度增加了3倍
  • 比较第2条语句和第3条语句:速度相差几十毫秒

接下来看下面这个查询

select * from order where id between 1000000 and 1000100 limit 100

查询时间:12ms

这种查询方式能够极大地优化查询速度,基本能够在几十毫秒之内完成。

还有一种写法

select * from orders_history where id >= 1000001 limit 100;

当然还可以使用 in 的方式来进行查询,这种方式经常用在多表关联的时候进行查询,使用其他表查询的id集合,来进行查询:

select * from order where id in(select order_id from goods where goodName = 'pen')limit 100;

 

原文链接:https://www.cnblogs.com/youyoui/p/7851007.html

 

转载于:https://www.cnblogs.com/qingchen521/p/8886005.html

你可能感兴趣的文章
MySQL5.7开多实例指导
查看>>
[51nod] 1199 Money out of Thin Air #线段树+DFS序
查看>>
poj1201 查分约束系统
查看>>
Red and Black(poj-1979)
查看>>
分布式锁的思路以及实现分析
查看>>
腾讯元对象存储之文件删除
查看>>
jdk环境变量配置
查看>>
安装 Express
查看>>
包含列的索引:SQL Server索引的阶梯级别5
查看>>
myeclipse插件安装
查看>>
浙江省第十二届省赛 Beauty of Array(思维题)
查看>>
NOIP2013 提高组 Day1
查看>>
个人对vue生命周期的理解
查看>>
cocos2dx 3.x simpleAudioEngine 长音效被众多短音效打断问题
查看>>
存储(硬件方面的一些基本术语)
查看>>
观察者模式
查看>>
Weka中数据挖掘与机器学习系列之基本概念(三)
查看>>
Win磁盘MBR转换为GUID
查看>>
大家在做.NET B/S项目的时候多用什么设技术啊?
查看>>
Java SE和Java EE应用的性能调优
查看>>