如何优化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 ...
随机推荐
- jfreechart应用2--柱状图(作者:百度 被风吹过的日子)
jfreechart应用2--柱状图 二. 柱状图 在WebRoot目录下建立bar目录,用来存放柱状图的各个例子.首先在该目录下建立一个sample1.jsp文件,让我们来看一个简单的柱状图的例 ...
- codeforces 686C C. Robbers' watch(dfs)
题目链接: C. Robbers' watch time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- 源代码管理工具SVN
1.源代码管理工具概述 2_SVN常用指令.hm Checkout把整个项目所有的源代码从服务器下载到本地 Update:将服务器上的代码更新到本地(只会更新被修改的文件) Commit:将本地的修改 ...
- bzoj 4543 HOTEL 加强版
题目大意: 求树上取三个点这三个点两两距离相等的方案数 思路: 远古时候的$n^2$做法是换根 但那样无法继续优化了 学习了一波长链剖分 考虑如何在一棵树上进行dp 设$f[i][j]$表示以$i$为 ...
- 【BZOJ 2456】 mode
[题目链接] 点击打开链接 [算法] 此题初看是大水题,只需调用std :: sort即可 但是,n最大500000,显然会超时 而且,内存限制1MB,我们连数组也开不了! 那怎么做呢 ? 我们发现, ...
- sqlserver2008Mail
use msdb GO DROP PROC MailTim GO CREATE PROC MailTim @Subject NVARCHAR(100),@Body NVARCHAR( ...
- SLC-测试-Postman:Postman 工具
ylbtech-SLC-测试-Postman:Postman 工具 1.返回顶部 1. 一.Request 请求 Request 请求,我们只介绍常用的四种:GET.POST.PUT.DELETE,其 ...
- asp.net mvc5 使用百度ueditor 本编辑器完整示例(上)
最近做一个项目,用到了百度ueditor富文本编辑器,功能强大,在线编辑文档,上传图片\视频.附件. MVC 模型的控制器准备: 1.建立模型. 在项目中Model 文件夹中建立 文章 模型,注意如果 ...
- git合并相关问题(copy)
[说明:资料来自http://gitbook.liuhui998.com/3_3.html] 一个Git仓库可以维护很多开发分支.现在我们来创建一个新的叫”experimental”的分支: $ gi ...
- Gym 100512B Betting Fast (题意+概率)
题意:你开始有 s 元钱,然后你要在 t 场内赚到 n 元,每次赢的概率是 p,并且要越快越好. 析:当时没注意这个条件,要越快越好,然后写概率dp,怎么看也不像是对.其实是每次赌 min(s, n- ...