Mysql LIMIT如何正确对其进行优化
Mysql LIMIT如何正确对其进行优化
我们今天主要和大家分享的是Mysql LIMIT简单介绍以及如何进行优化的相关内容的描述,以下就是正文的主要内容描述。
以下的文章主要是对Mysql LIMIT简单介绍,我们大家都知道LIMIT子句一般是用来限制SELECT语句返回的实际行数。LIMIT取1个或是2个数字参数,如果给定的是2个参数,第一个指定要返回的第一行的偏移量,第二个指定返回行的最大数目。
初始行的偏移
量是0(不是1)。
- mysql> select * from table LIMIT 6,10;
 
得到第7-16行
如果给定一个参数,它指出返回行的最大数目。
- mysql> select * from table LIMIT 5;
 
得到前5行
换句话说,LIMIT n等价于Mysql LIMIT 0,n。MYSQL的优化是非常重要的。其他最常用也最需要优化的就是limit。mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。同样是取10条数据
- select * from yanxue8_visit limit 10000,10
 
和
- select * from yanxue8_visit limit 0,10
 
就不是一个数量级别的。
网上也很多关于limit的五条优化准则,都是翻译自mysql手册,虽然正确但不实用。今天发现一篇文章写了些关于limit优化的,很不错。原文地址:http://www.zhenhua.org/article.asp?id=200(下面附有原文)
文中不是直接使用limit,而是首先获取到offset的id然后直接使用Mysql limit size来获取数据。根据他的数据,明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。(测试环境win2033+p4双核 (3GHZ) +4G内存 mysql 5.0.19)
1、offset比较小的时候。
- select * from yanxue8_visit limit 10,10
 
多次运行,时间保持在0.0004-0.0005之间
- Select * From yanxue8_visit Where vid >=(
 - Select vid From yanxue8_visit Order By vid limit 10,1
 - ) limit 10
 
多次运行,时间保持在0.0005-0.0006之间,主要是0.0006结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。
2、offset大的时候
- select * from yanxue8_visit limit 10000,10
 
多次运行,时间保持在0.0187左右
- Select * From yanxue8_visit Where vid >=(
 - Select vid From yanxue8_visit Order By vid limit 10000,1
 - ) limit 10
 
多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。
附上原文:
select * from table LIMIT 5,10; #返回第6-15行数据
select * from table LIMIT 5; #返回前5行
select * from table LIMIT 0,5; #返回前5行
性能优化:
基于MySQL5.0中Mysql limit的高性能,我对数据分页也重新有了新的认识.
- Select * From cyclopedia Where ID>=(
 - Select Max(ID) From (
 - Select ID From cyclopedia Order By ID limit 90001
 - ) As tmp
 - ) limit 100;
 - Select * From cyclopedia Where ID>=(
 - Select Max(ID) From (
 - Select ID From cyclopedia Order By ID limit 90000,1
 - ) As tmp
 - ) limit 100;
 
同样是取90000条后100条记录,第1句快还是第2句快?
第1句是先取了前90001条记录,取其中最大一个ID值作为起始标识,然后利用它可以快速定位下100条记录
第2句择是仅仅取90000条记录后1条,然后取ID值作起始标识定位下100条记录
第1句执行结果.100 rows in set (0.23) sec
第2句执行结果.100 rows in set (0.19) sec
很明显第2句胜出.看来limit好像并不完全像我之前想象的那样做全表扫描返回limit offset+length条记录,这样看来limit比起MS-SQL的Top性能还是要提高不少的.
其实第2句完全可以简化成
- Select * From cyclopedia Where ID>=(
 - Select ID From cyclopedia limit 90000,1
 - )limit 100;
 
直接利用第90000条记录的ID,不用经过Max运算,这样做理论上效率因该高一些,但在实际使用中几乎看不到效果,因为本身定位ID返回的就是1条记录,Max几乎不用运作就能得到结果,但这样写更清淅明朗,省去了画蛇那一足.
可是,既然MySQL有limit可以直接控制取出记录的位置,为什么不干脆用Select * From cyclopedia limit 90000,1呢?岂不更简洁?
这样想就错了,试了就知道,结果是:1 row in set (8.88) sec,怎么样,够吓人的吧,让我想起了昨天在4.1中比这还有过之的"高分".Select * 最好不要随便用,要本着用什么,选什么的原则, Select的字段越多,字段数据量越大,速度就越慢. 上面2种分页方式哪种都比单写这1句强多了,虽然看起来好像查询的次数更多一些,但实际上是以较小的代价换取了高效的性能,是非常值得的.
第1种方案同样可用于MS-SQL,而且可能是最好的.因为靠主键ID来定位起始段总是最快的.
- Select Top 100 * From cyclopedia Where ID>=(
 - Select Top 90001 Max(ID) From (
 - Select ID From cyclopedia Order By ID
 - ) As tmp
 - )
 
但不管是实现方式是存贮过程还是直接代码中,瓶颈始终在于MS-SQL的TOP总是要返回前N个记录,这种情况在数据量不大时感受不深,但如果成百上千万,效率肯定会低下的.相比之下MySQL的Mysql limit就有优势的多,执行:
- Select ID From cyclopedia limit 90000
 - Select ID From cyclopedia limit 90000,1
 
而MS-SQL只能用Select Top 90000 ID From cyclopedia 执行时间是390ms,执行同样的操作时间也不及MySQL的360ms.
Mysql LIMIT如何正确对其进行优化的更多相关文章
- 大数据量时 Mysql LIMIT如何正确对其进行优化(转载)
		
以下的文章主要是对Mysql LIMIT简单介绍,我们大家都知道LIMIT子句一般是用来限制SELECT语句返回的实际行数.LIMIT取1个或是2个数字参数,如果给定的是2个参数,第一个指定要返回的第 ...
 - (转)Mysql LIMIT如何正确对其进行优化
		
以下的文章主要是对Mysql LIMIT简单介绍,我们大家都知道LIMIT子句一般是用来限制SELECT语句返回的实际行数.LIMIT取1个或是2个数字参数,如果给定的是2个参数,第一个指定要返回的第 ...
 - MySQL limit 分页查询优化(百万级优化)
		
1)简单的查询分页:分每页5条 limit [offset],[rows] ,10; 2)建立id索引:查询索引id ,) limit ; 3)使用 between and 语句分页效率快N倍 ; 4 ...
 - 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案
		
如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案
 - MySQL Limit优化(转)
		
原文:http://bbs.landingbj.com/t-0-240894-1.html 首先,我们看一个分页SQL: SELECT time,pageFROM `l_not_200_page`WH ...
 - 高性能MySQL笔记 第6章 查询性能优化
		
6.1 为什么查询速度会慢 查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...
 - MySQL数据库_索引_事务_优化 _锁_存储引擎_存储过程_CAP
		
##一.基础 ## * 插入 INSERT INTO table_name ( field1, field2,...fieldN ) ...
 - 我的MYSQL学习心得(十六) 优化
		
我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
 - mysql limit查询优化
		
mysql数据库中的查询语句有关limit语句的优化. 一般limit是用在分页的程序的分页上的,当应用数据量够小时,也许感觉不到limit语句的任何问题,但当查询数据量达到一定程度时,limit的性 ...
 
随机推荐
- 基于SolrCloud的内容搜索和热点推送
			
➠更多技术干货请戳:听云博客 什么是热点 我认为热点有时效性和受众面 用户关注从低到高再到低的内容 .有公共热点和分类热点.例如医辽养老全民关注,科技汽车等只有特定的人群关注. 推送的条件 搜索频次达 ...
 - DFX 安全测试-- 告诉你什么是XSS、sql注入?POST和GET的区别....
			
1.用户权限测试 (1) 用户权限控制 1) 用户权限控制主要是对一些有权限控制的功能进行验证 2) 用户A才能进行的操作,B是否能够进行操作(可通过窜session,将在下面介绍) 3)只能有A条件 ...
 - Java基础知识学习(七)
			
线程(续) 线程同步 当两个或两个以上的线程需要共享资源,它们需要某种方法来确定资源在某一刻仅被一个线程占用.达到此目的的过程叫做同步(synchronization) 可以用两种方法同步化代码.两者 ...
 - PreferenceScreen监听子项的刷新
			
有个PreferenceScreen,他有一些个子项目.它的Summary需要根据子项的设置来改变的,所以需要监听子项的刷新事件. preferenceScreen.setOnPreferenceCh ...
 - 创建android Notification
			
说明:根据项目选择的基础sdk,选择不同的创建Notification的方法1 在android sdk 3.0 之前直接通过 new Notification的方法直接创建通知对象 2 在andro ...
 - JavaScript Patterns 5.8 Chaining Pattern
			
Chaining Pattern - Call methods on an object one after the other without assigning the return values ...
 - Fourth glance in Go
			
在Go里面的结构体和方法是很有意思的内容.它即和OO有点像,但又不完全一样.为什么这么说呢?当你把结构体映射为OO里面的类的时候,你给结构体添加方法,你就会发现其实方法与结构体并没有严格意义上的关系. ...
 - C#语句1:选择语句二(switch  break)
			
(二)switch case switch case 必须与 break 一同使用.break是跳转语句.与switch case连用的时候是跳出最近的{}. 注: ●若case后面接收的是字符串类型 ...
 - SQL动态列查询
			
数据库中为了实现表格数据的自由设置,我们经常设计纵表,或者列定义的表(如下KeyValue),定义一个列超级多的表中每个字段的意义. 但是在设计时简单的东西却很容易被人们忘记,如下一个简单但是很松散的 ...
 - InnoDB源码分析--事务日志(二)
			
原创文章,转载请标明原文链接:http://www.cnblogs.com/wingsless/p/5708992.html 昨天写了有关事务日志的一些基本点(http://www.cnblogs.c ...
 
			
		