首先我们先创建个数据表做测试
表名 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. vs2013/2015中scanf函数类似于error C4996: 'scanf': This function or variable may be unsafe的安全检查错误

    在使用vs2015时,遇到了scnaf函数安全性的问题,程序不能正常运行,错误如下: error C4996: 'scanf': This function or variable may be un ...

  2. 给Xcode增加复制行、删除行快捷键的方法

    运行: sudo chmod 666 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKey ...

  3. BZOJ_2118_墨墨的等式_最短路

    BZOJ_2118_墨墨的等式_最短路 Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及 ...

  4. 服务器开发入门——理解异步I/O

    对于服务器程序,I/O是制约系统性能最关键的因素.对于需要处理大量连接的高并发服务器程序,异步I/O几乎是不二的选择.Linux和Windows都为异步I/O构建了大量的基础设施.本文总结了一下Lin ...

  5. bzoj 1898

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1197  Solved: 661[Submit][S ...

  6. PHP编程常见小错误错误

    使用PHP的过程中经常因为粗心出一些简单的错误,先将自己遇到几个的记录下来,以后慢慢增加. 1 Fatal error: Function name must be a string 翻译很简单,就是 ...

  7. P4324 [JSOI2016]扭动的回文串

    传送门 对\(A\).\(B\)串各跑一遍\(manacher\),求出第\(1\).\(2\)类扭动回文串的最大长度. 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l) ...

  8. OKEX websocket API 连接Python范例

    因为 websocket-client 新版的各种大脑降级设计 很多功能无法使用需要安装老版本websocket-client的包才能正常使用 pip3 install websocket-clien ...

  9. 面试杂谈:面试程序员时都应该考察些什么?<转>

    一般来说,一线成熟企业技术岗位的典型招聘流程分为以下几个步骤: 初筛:一般由直接领导的技术经理或HR进行,重点考察教育和工作经历 一面:一般由可能直接与之共事的工程师进行,重点考察基础和工作能力 二面 ...

  10. Golang bash脚本自动创建一个go工程

    原作者的代码里面,存在智能引号问题,所以他的代码并不能正常运行: 这个是我微调后的版本. 代码如下: #!/bin/bash #————————————– # Module : mk_go_pro.s ...