如何优化LIMIT
首先我们先创建个数据表做测试
表名 test (id(int) , name(var char) , content(text) , pid(int) ) 往里面倒几百万条数据进去做测试。
我们都知道分页是 这样写的
select * from test limit 10,20;
比如每页显示perpage条,当前是第N页;
那么就是这么来写
select * from test limit ( N-1 )*perage,N
1
好我们现在先来试试查询速度
select id,name from test limit 1000,10;
1
先从一千页分起; 一千行还看不出什么基本上0.01秒就可以了,
select id,name from collect test 1000000,10;
1
从100万行来分 现在问题就来了 要差不多10秒左右了; 这是哪里出了问题?
其实很简单 因为它是要先找出前的100万行 再取出10行 ,所以速度会慢 。
今天我们就要来讲解一下这个问题我们要怎么解决
我们要知道公司的需求 从业务上来解决 我下面写几个优化方案、
1、模仿百度、谷歌方案
类似于分段。我们给每次只能翻100页、超过一百页的需要重新加载后面的100页。这样就解决了每次加载数量数据大 速度慢的问题了
2、记录每次取出后的最大id 然后 where id = 最大id limit 10;这样就可以解决了 然后我们来跑一下;
select id from test where id = 最大id limit 10;看看结果,时间是0.001秒! 几乎可以说是没有任何时间了
3、做索引
先看看没做索引之前的加载速度
select * from test where pid=1 order by id limit 1000000,10;
很慢,用了十多秒呢!
是不是很纳闷是怎么回事呢 因为我们这个pid 做了全局扫描啊 pid一个个对比过来那可是耗费了非常多的时间;下面我们看看要怎么来添加索引做优化
建一个索引表:p(id,name,pid) 并设置成定长,然后做分页,分页出结果再到 test 里面去找name。
select * from p where pid=1 order by id limit 1000000,10 ;
1
还是有点慢。基本上 4 - 5秒可以跑完。
其实这个我给大家买了个关子 我是建立三个列(id,name,pid) *这里重点注意下* 列越多越慢 因为他要一直回行(意思就是他要每次都要找出这个字段的内容。然后对比了where发现这个name取出来没有用 又把它丢了重新取 每次都要多取一个name ) 要是在我们正常开发中 可能有七八个列甚至更多的试试这个是致命的 所以最好是 只建立 id 和 pid 然后查出10个pid 取出id 单独去查出来 或者是子查询 有会比较快 。但是如果数据量小的话就不推荐了 因为我这说的是百万级别的查询了 。这样查询大概可以翻个一番了;
再测试: select id from test where pid = 1 limit 100000,10; 0.1秒这样就非常快了 记住pid是索引所以找个id还是非常快的。
得出结论:如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键!
这样就完美解决了分页问题了。可以快速返回id就有希望优化limit , 按这样的逻辑,百万级的limit 应该在0.0x秒就可以分完。
如何优化LIMIT的更多相关文章
- 在MySQL中如何使用覆盖索引优化limit分页查询
背景 今年3月份时候,线上发生一次大事故.公司主要后端服务器发生宕机,所有接口超时.宕机半小时后,又自动恢复正常.但是过了2小时,又再次发生宕机. 通过接口日志,发现MySQL数据库无法响应服务器.在 ...
- mysql优化limit
limit 1.当只需要一条数据的时候,用limit1: 2.当需要提高分页效率的时候: 如果用上面的语句分页少量数据还是可以用的,但是随着数据量越来越大,直接用limit语句查询速度就会越来越慢,降 ...
- MySQL 优化Limit分页
很多时候.我们需要选择出从指定位置开始的指定行数.此时.limit笑了 对于limit的定义是: limit x,y 表示从第x行开始选择y条记录 在业务需要 ...
- mysql优化limit分页
- limit 百万级数据分页优化方法
mysql教程 这个数据库教程绝对是适合dba级的高手去玩的,一般做一点1万 篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发.可是数据量到了10万,百万至千万,他的性能还能那么高吗? 一点小 ...
- MYSQL分页limit速度太慢优化方法
http://www.fienda.com/archives/110 在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死 ...
- Mysql分页之limit用法与limit优化
Mysql limit分页语句用法 与Oracle和MS SqlServer相比,mysql的分页方法简单的让人想哭. --语法: SELECT * FROM table LIMIT [offset, ...
- Mysql limit 优化,百万至千万级快速分页,--复合索引的引用并应用于轻量级框架
MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考这个问题还是从前天开始.有过痛苦有过绝望,到现在充满信心!MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻 ...
- MySQL limit 分页查询优化(百万级优化)
1)简单的查询分页:分每页5条 limit [offset],[rows] ,10; 2)建立id索引:查询索引id ,) limit ; 3)使用 between and 语句分页效率快N倍 ; 4 ...
随机推荐
- python 判断是否为有效域名
import re pattern = re.compile( r'^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|' r'([a-zA-Z]{1}[0-9]{1}) ...
- 推荐一款很好用的调试js的eclipse插件
ie调试的话用 Companion.JS 一个插件 很好用的 不用配置,直接安装eclipse调试的话 可以用jsdt 可能需要配置下 网上有很多说明http://wokaours.blog.163. ...
- 二:网络--GET请求和POST请求
一.GET请求和POST请求简单说明 GET - 从指定的服务器中获取数据 POST - 提交数据给指定的服务器处理 GET方法: 使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送 ...
- 稳定婚姻(tarjan)
传送门 这道题一开始可能以为是二分图匹配……?不过后来发现和二分图没啥大关系. 简单分析之后发现,把夫妻之间连边(男性向女性连边),之后再将每对曾经是情侣的人连边(女性向男性连边),当然以上的方向可以 ...
- bzoj4033 [HAOI2015]树上染色——树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4033 树形DP,状态中加入 x 与父亲之间的边的贡献: 边权竟然是long long... ...
- 《JAVA与模式》之责任链模式
责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...
- Sencha Cmd使用
通过Sencha Cmd辅助开发基于ExtJS4 MVC的项目 http://www.ineeke.com/archives/1465/ ExtJS4.2:Sencha Cmd 介绍:http://w ...
- 【黑金教程笔记之002】【建模篇】【Lab 01 永远的流水灯】—笔记&勘误
学习并行操作的思想. 勘误001: Page 17,模块图下方,“扫描频配置定为100Hz”应为10Hz. 勘误002: Page 17,最后一行 “10ms”应为100ms:“2.5ms”应为25m ...
- SQL两个字段排序
ORDER BY 后可加2个字段,用英文逗号隔开. 1.f1用升序, f2降序,sql该这样写: 1 ORDER BY f1, f2 DESC 2.也可以这样写,更清楚: 1 ORDER BY ...
- Swift4 内存管理, 可选链, KeyPath
创建: 2018/03/09 完成: 2018/03/09 参照型数据与ARC ARC ● Swift里, 只有类实例与闭包实例是参照型 ● 生成时参照值为1, 被代入等每次+1, 减少每次-1 ● ...