MySQL--limit使用注意
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使用注意的更多相关文章
- Mysql LIMIT如何正确对其进行优化
Mysql LIMIT如何正确对其进行优化 2010-05-17 17:09 佚名 博客园 字号:T | T 我们今天主要和大家分享的是Mysql LIMIT简单介绍以及如何进行优化的相关内容的描述, ...
- mysql limit查询优化
mysql数据库中的查询语句有关limit语句的优化. 一般limit是用在分页的程序的分页上的,当应用数据量够小时,也许感觉不到limit语句的任何问题,但当查询数据量达到一定程度时,limit的性 ...
- Mysql limit offset
Mysql limit offset 假设数据库表student存在13条数据. 语句1:select * from student limit 9,4 语句2:slect * from studen ...
- 大数据量时 Mysql LIMIT如何正确对其进行优化(转载)
以下的文章主要是对Mysql LIMIT简单介绍,我们大家都知道LIMIT子句一般是用来限制SELECT语句返回的实际行数.LIMIT取1个或是2个数字参数,如果给定的是2个参数,第一个指定要返回的第 ...
- (转)Mysql LIMIT如何正确对其进行优化
以下的文章主要是对Mysql LIMIT简单介绍,我们大家都知道LIMIT子句一般是用来限制SELECT语句返回的实际行数.LIMIT取1个或是2个数字参数,如果给定的是2个参数,第一个指定要返回的第 ...
- mysql limit语句
[mysql limit语句] 代码: SELECT * FROM table LIMIT 2 OFFSET 1; 比如这个SQL ,limit后面跟的是2条数据,offset后面是从第1条开始读取. ...
- Mysql limit offset用法举例
转自:http://blog.csdn.net/iastro/article/details/53037600 Mysql limit offset示例 例1,假设数据库表student存在13条数据 ...
- MySQL Limit 限定查询记录数
MySQL Limit 限定查询记录数 MySQL LIMIT MySQL 中 LIMIT 关键字用于限定查询记录返回最大数目. 语法: ... LIMIT offset , rows 该语法中,of ...
- Python MySQL Limit
章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...
- mysql limit分页查询优化写法
在mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用orderby排 序.但是在表数据量比较大的时候,例如查询语句片段limit 10000, 20,数据库会读取10020条 ...
随机推荐
- DeepFaceLab 如何开启轻量级编码器?
很多人可能没有了解过这个参数.其实对于某些显存比较低的人,或者想要快点出结果的人非常有用. 什么是轻量级编码器? 轻量级本质上就是降低了神经网络的复杂程度(什么是神经网络? 这个….) 启用这个选项后 ...
- 六、RF中断言关键字使用详解
1.should be equal 和should be not equal :比较两个值相等或不相等 2.should start with 和should not start with :判 ...
- Octavia health-manager 与 amphora 故障修复的实现与分析
目录 文章目录 目录 Health Manager 监控 amphora 健康状态 故障转移 故障迁移测试 Health Manager Health Manager - This subcompon ...
- 2018.03.29 python-pandas 数据透视pivot table / 交叉表crosstab
#透视表 pivot table #pd.pivot_table(data,values=None,index=None,columns=None, import numpy as np import ...
- Matlab 文件格式化/Matlab Source File Formattor
由于需要使用到别人编写的Matlab代码文件,但是呢不同的人有不同的风格,有的写得就比较糟糕了. 为了更好地理解代码的内容,一个比较美观的代码会让人身心愉悦. 但是在网上并没有找到一个比较好的实现,此 ...
- 9.shodan搜索引擎----Metasploit Web GUI----取证工具箱----sAINT间谍软件
shodan搜索引擎 物联网搜索引擎 访问路由器,服务器,网络摄像头,安装CLI banner抓取,端口扫描 www.shodan.io 需要注册账户,支持google账户 搜索 webcams 网络 ...
- Bubble Sort(冒泡排序)
冒泡排序(英语:Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行 ...
- 大二 Java上学期总结
一学期的Java学习结束了,这学期对程序语言的理解更深了,首先感谢李津老师的教导,这学期收获挺多的,不像上学期,这学期没有任何缺课表现,希望之后的语言程序学习会更加努力. 突然感觉Java的学习如此之 ...
- soot学习历程---(1)
今天看了soot生成手册的部分内容,简单摘录一下 Scene 表示分析所处的完整环境,可以借此设置application class(用sootclass),主类(main),point-to和cal ...
- Kinect V2入门之数据获取步骤
在Kinect for windows SDK2.0中,获取并处理数据源接口步骤如下: Sensor -> Source -> Reader -> Frame -> Data ...