首先我们先创建个数据表做测试
表名 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的更多相关文章

  1. 在MySQL中如何使用覆盖索引优化limit分页查询

    背景 今年3月份时候,线上发生一次大事故.公司主要后端服务器发生宕机,所有接口超时.宕机半小时后,又自动恢复正常.但是过了2小时,又再次发生宕机. 通过接口日志,发现MySQL数据库无法响应服务器.在 ...

  2. mysql优化limit

    limit 1.当只需要一条数据的时候,用limit1: 2.当需要提高分页效率的时候: 如果用上面的语句分页少量数据还是可以用的,但是随着数据量越来越大,直接用limit语句查询速度就会越来越慢,降 ...

  3. MySQL 优化Limit分页

    很多时候.我们需要选择出从指定位置开始的指定行数.此时.limit笑了     对于limit的定义是:     limit x,y     表示从第x行开始选择y条记录          在业务需要 ...

  4. mysql优化limit分页

  5. limit 百万级数据分页优化方法

    mysql教程 这个数据库教程绝对是适合dba级的高手去玩的,一般做一点1万 篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发.可是数据量到了10万,百万至千万,他的性能还能那么高吗? 一点小 ...

  6. MYSQL分页limit速度太慢优化方法

    http://www.fienda.com/archives/110 在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死 ...

  7. Mysql分页之limit用法与limit优化

    Mysql limit分页语句用法 与Oracle和MS SqlServer相比,mysql的分页方法简单的让人想哭. --语法: SELECT * FROM table LIMIT [offset, ...

  8. Mysql limit 优化,百万至千万级快速分页,--复合索引的引用并应用于轻量级框架

    MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考这个问题还是从前天开始.有过痛苦有过绝望,到现在充满信心!MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻 ...

  9. MySQL limit 分页查询优化(百万级优化)

    1)简单的查询分页:分每页5条 limit [offset],[rows] ,10; 2)建立id索引:查询索引id ,) limit ; 3)使用 between and 语句分页效率快N倍 ; 4 ...

随机推荐

  1. mac终端命令加密压缩文件为zip包

    mac终端命令加密压缩文件为zip包,命令如下: zip -e ~/desktop/a.zip b.doc c.txt d.sql 注释:a.zip为加密后的文件 b.doc c.txt d.sql为 ...

  2. codeforces 689C C. Mike and Chocolate Thieves(二分)

    题目链接: C. Mike and Chocolate Thieves time limit per test 2 seconds memory limit per test 256 megabyte ...

  3. C++ 多线程与并发

    1. 非原子操作 这些非原子操作在被编译为汇编代码后不止一条指令. 自加.自减少: new 关键字: 申请内存: 调用构造函数: pInst = new T; // 对于这样一个赋值语句,更是包含了如 ...

  4. bzoj4806 炮——DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4806 看到这题首先会想到状压什么乱七八糟的,然而很难做: 其实,因为求的是方案数,所以并不需 ...

  5. 获取http请求的响应状态

    import urllib.request url="http://www.baidu.com" #返回一个对象 response=urllib.request.urlopen(u ...

  6. 461. Hamming Distance(汉明距离)

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  7. poj 2391 Ombrophobic Bovines【最大流】

    我%--&(¥--,调了一下午,最后发现P赋值1e5能过,赋值1e6就会TLE致死.改了一下午加一晚上然而这是为什么??? 一种常见的建图套路,首先二分答案,注意上界要取大一点,1e9是不行的 ...

  8. JAVA 毕业设计 辅导

    JAVA 毕业设计 辅导   =======================================================  

  9. [POI2007]大都市meg

    Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n ...

  10. 小心我“DIR”溢出你!

    转自https://blog.csdn.net/wql19881207/article/details/6300760 https://blog.csdn.net/wql19881207/articl ...