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。

MySQL--limit使用注意的更多相关文章

  1. Mysql LIMIT如何正确对其进行优化

    Mysql LIMIT如何正确对其进行优化 2010-05-17 17:09 佚名 博客园 字号:T | T 我们今天主要和大家分享的是Mysql LIMIT简单介绍以及如何进行优化的相关内容的描述, ...

  2. mysql limit查询优化

    mysql数据库中的查询语句有关limit语句的优化. 一般limit是用在分页的程序的分页上的,当应用数据量够小时,也许感觉不到limit语句的任何问题,但当查询数据量达到一定程度时,limit的性 ...

  3. Mysql limit offset

    Mysql limit offset 假设数据库表student存在13条数据. 语句1:select * from student limit 9,4 语句2:slect * from studen ...

  4. 大数据量时 Mysql LIMIT如何正确对其进行优化(转载)

    以下的文章主要是对Mysql LIMIT简单介绍,我们大家都知道LIMIT子句一般是用来限制SELECT语句返回的实际行数.LIMIT取1个或是2个数字参数,如果给定的是2个参数,第一个指定要返回的第 ...

  5. (转)Mysql LIMIT如何正确对其进行优化

    以下的文章主要是对Mysql LIMIT简单介绍,我们大家都知道LIMIT子句一般是用来限制SELECT语句返回的实际行数.LIMIT取1个或是2个数字参数,如果给定的是2个参数,第一个指定要返回的第 ...

  6. mysql limit语句

    [mysql limit语句] 代码: SELECT * FROM table LIMIT 2 OFFSET 1; 比如这个SQL ,limit后面跟的是2条数据,offset后面是从第1条开始读取. ...

  7. Mysql limit offset用法举例

    转自:http://blog.csdn.net/iastro/article/details/53037600 Mysql limit offset示例 例1,假设数据库表student存在13条数据 ...

  8. MySQL Limit 限定查询记录数

    MySQL Limit 限定查询记录数 MySQL LIMIT MySQL 中 LIMIT 关键字用于限定查询记录返回最大数目. 语法: ... LIMIT offset , rows 该语法中,of ...

  9. Python MySQL Limit

    章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...

  10. mysql limit分页查询优化写法

    在mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用orderby排 序.但是在表数据量比较大的时候,例如查询语句片段limit 10000, 20,数据库会读取10020条 ...

随机推荐

  1. 九、SpringBoot集成Thymeleaf模板引擎

    Thymeleaf咋读!??? 呵呵,是不是一脸懵逼...哥用我的大学四级英文知识告诉你吧:[θaimlif]. 啥玩意?不会音标?...那你就这样叫它吧:“赛母李府”,大部分中国人是听不出破绽的.. ...

  2. ftp4j揭示java.net.SocketException: Connection reset的解决

    ftp4j提示java.net.SocketException: Connection reset的解决系统的自动更新FTP服务器,其他计算机连接都没有问题,包括xp.server2008.win7. ...

  3. 使用Callable或DeferredResult实现springmvc的异步请求

    使用Callable实现springmvc的异步请求 如果一个请求中的某些操作耗时很长,会一直占用线程.这样的请求多了,可能造成线程池被占满,新请求无法执行的情况.这时,可以考虑使用异步请求,即主线程 ...

  4. Alert弹出框处理

    selenium的API提供了Alert类对alert弹出框的处理的方法,涉及到的方法有text,dismiss(),accept()和send_keys(),在javascript中主要有alert ...

  5. Android Studio编译报错Could not reserve enough space for 2097152KB object heap解决方法

    环境变量中添加

  6. YARN日志聚合相关参数配置

    日志聚合是YARN提供的日志中央化管理功能,它能将运行完成的Container/任务日志上传到HDFS上,从而减轻NodeManager负载,且提供一个中央化存储和分析机制.默认情况下,Contain ...

  7. 【Qt开发】事件循环与线程 二

    事件循环与线程 二 Qt 线程类 Qt对线程的支持已经有很多年了(发布于2000年九月22日的Qt2.2引入了QThread类),Qt 4.0版本的release则对其所有所支持平台默认地是对多线程支 ...

  8. node.js中的 compression 中间件

    NodeJs——express启用gzip gzip是用于压缩,js.css等文件的压缩 具体方法如下: 先安装一个依赖 npm install compression --save 在项目的 app ...

  9. Python--笔试题

    一.如何提高Python的运行效率: 1.使用生成器,因为可以节约大量内存 2.循环代码优化,避免过多重复代码的执行 3.核心模块用Cython PyPy等,提高效率 4.多进程.多线程.协程 5.多 ...

  10. [转帖]又一国产x86处理器可大规模上市:Intel至强核心 安全监测管控

    又一国产x86处理器可大规模上市:Intel至强核心 安全监测管控 https://www.cnbeta.com/articles/tech/850525.htm 不知道是不是有一起汉芯事件 国产CP ...