limit m,n 的意义是在选择、查询得到的结果中,从第m条开始,拿连续的n条作为结果返回。根据它的原理可以知道,select ....limit m,n时要扫描得到的数据条数是m+n条。这就导致m特别大的时候,select执行完成会花费很多时间。但是limit大都数情况下又是必须要用的,因为limit可以让数据库只返回服务器真正需要的数据条数,减少了网络中传输的开销。现在有表table1:

  id          value      type

-------------------------------------

  1          100           0

2          2009         1

.....         ......            ....

id为递增主键,value建立了索引。这个表有几百万的数据,现在执行sql:

select * from table1 where value = 100 limit 300000,10

上述sql很简单,人肉解析: 从为value建立的索引上找到300010条value=100的记录的id,再拿这300010个id去主键索引找到对应的叶子结点,拿到每个id对应的数据返回。这种方式下,sql的执行非常耗时。

解决办法1,使用索引覆盖得到含300010条数据的子表,与原表做连接,再select:

select * from table1 A inner join (
select id from table1 where value = 100 limit 300000,10
) as B
on A.id = B.id

变化就是 select id from table1 where value = 100 limit 300000,10  在value的索引上查询时只是把id查出来,由于这个索引上本来就有id,因此这时用到了索引覆盖,速度非常快。在得到300010个id的后10个后,与原表用id做一个连接,再select * 即可完成原有的功能,速度非常快。

解决办法2:有些情况可以 使用 limit n 代替 limit m,n

如果条件允许,即我们知道下一次查询第一条数据的筛选条件,那就应该使用这个条件使得:where查出的数据第一条就是我们需要的,只需从第一条连续取n条即可:

select id from table1 where value = 100 and id > xxx and xxx .... limit 10

当然,上面的方法虽然是执行速度特别快,但只是在我们知道下一条数据的条件时才能做到。

总结就是:

1. 如果limit m, n时 m 特别大,select 的列又没能用上索引覆盖,就可以考虑先select某个列以用上索引覆盖并把结果作为一个子表,再用原表与子表做连接,最后select出所有列。

2. 如果我们知道下一条我们需要的数据的查询条件,就可以考虑用where语句时用上这个条件,然后使用 limit n 从第一条取连续的 n 条,避免查询大量的无效行。

归根结底就是:减少MySQL 从磁盘读取数据页的数量,InnoDB每个页一般16KB。

最新文章

  1. Jcapta
  2. Sublime Text3 protobuf syntax file(语法文件)
  3. SIT和UAT的区别
  4. 【24点游戏】cocos2dx 源码
  5. HD2025查找最大元素
  6. [翻译][MVC 5 + EF 6] 6:创建更复杂的数据模型
  7. poj 3468 A Simple Problem with Integers【线段树区间修改】
  8. zoj 1372
  9. safari浏览器cookie问题
  10. hdu3033I love sneakers! (分组背包,错了很多次)
  11. python3 集合 操作方法
  12. python中字符编码及unicode和utf-8区别
  13. Docker阿里云镜像加速
  14. API(一)之Serialization
  15. VB脚本错误,系统找不到制定的文件 。代码:80070002
  16. Java的File.separator
  17. P4546 [THUWC2017]在美妙的数学王国中畅游
  18. mysql注入快速学习基础
  19. 搭建自己的pypi私有源服务器
  20. 位运算(Bit Manipulation)在算法中的应用

热门文章

  1. Html/CSS 初步介绍html和css部分重要标签
  2. FireMonkey 绘图(1)
  3. springmvc 获取request response
  4. Python2.7安装&配置环境变量
  5. 解析jmeter阶梯加压与请求的计算
  6. Flask(六)—— 自定义session
  7. java版微信支付/查询/撤销
  8. [DS+Algo] 006 两种简单排序及其代码实现
  9. [DS+Algo] 002 一维表结构
  10. [转帖]Linux shell中2>&1的含义解释 (全网最全,看完就懂)