使用Limit参数优化MySQL查询的方法


Posted in PHP onNovember 12, 2008

前些天看了一个老外写的程序,在 MySQL 查询中使用了很多 Limit 关键字,这就让我很感兴趣了,因为在我印象中, Limit 关键字似乎更多被使用 MySQL 数据库的程序员用来做查询分页(当然这也是一种很好的查询优化),那在这里举个例子,假设我们需要一个分页的查询 ,Oracle中一般来说都是用以下 SQL 句子实现:
SELECT * FROM
( SELECT a1.*, rownum rownum_
FROM testtable a1
WHERE rownum > 20)
WHERE rownum_ <= 1000
这个语句就能查询到 testtable 表中的 20 到 1000 记录,而且还需要嵌套查询,效率不会太高,看看 MySQL 的实现:
SELECT * FROM testtable a1 limit 20,980;
这样就能返回 testtable 表中的 21 条到( 20 + 980 =) 1000 条的记录。
实现语法确实简单,但如果要说这里两个 SQL 语句的效率,那就很难做比较了,因为在 MySQL 中 Limit 选项有多种不同的解释方式,不同方式下的速度差异是很大的,因此我们不能从这语句的简洁程度就说谁的效率高。
不过对程序员来说,够简单就好,因为维护成本低,呵呵。
下面讲讲这个 Limit 的语法吧:
SELECT ……. --Select 语句的其他参数
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
这里 offset 是偏移量(这个偏移量的起始地址是 0 ,而不是 1 ,这点很容易搞错的)顾名思义就是离开起始点的位置,而 row-count 也是很简单的,就是返回的记录的数量限制。
Eg. SELECT * FROM testtable a limit 10,20 where ….
这样就能使结果返回 10 行以后(包括 10 行自身)的符合 where 条件的 20 条记录。
那么如果没有约束条件就返回 10 到 29 行的记录。
那这跟避免全表扫描有什么关系呢? 下面是 MySQL 手册对 Limit 参数优化扫描的一些说明:
在一些情况中,当你使用 LIMIT 选项而不是使用 HAVING 时, MySQL 将以不同方式处理查询。
l 如果你用 LIMIT 只选择其中一部分行,当 MySQL 一般会做完整的表扫描时,但在某些情况下会使用索引(跟 ipart 有关)。
l 如果你将 LIMIT n 与 ORDER BY 同时使用,在 MySQL 找到了第一个符合条件的记录后,将结束排序而不是排序整个表。
l 当 LIMIT n 和 DISTINCT 同时使用时, MySQL 在找到一个记录后将停止查询。
l 某些情况下, GROUP BY 能通过顺序读取键 ( 或在键上做排序 ) 来解决,并然后计算摘要直到键值改变。在这种情况下, LIMIT n 将不计算任何不必要的 GROUP 。
l 当 MySQL 完成发送第 n 行到客户端,它将放弃余下的查询。
l 而 LIMIT 0 选项总是快速返回一个空记录。这对检查查询并且得到结果列的列类型是有用的。
l 临时表的大小使用 LIMIT # 计算需要多少空间来解决查询。

PHP 相关文章推荐
创建配置文件 用PHP写出自己的BLOG系统 2
Apr 12 PHP
php对mongodb的扩展(初出茅庐)
Nov 11 PHP
PHP之生成GIF动画的实现方法
Jun 07 PHP
php使用数组填充下拉列表框的方法
Mar 31 PHP
php读取torrent种子文件内容的方法(测试可用)
May 03 PHP
php自动载入类用法实例分析
Jun 24 PHP
PHP会话操作之cookie用法分析
Sep 28 PHP
ZendFramework框架实现连接两个或多个数据库的方法
Dec 08 PHP
php 解决扫描二维码下载跳转问题
Jan 13 PHP
如何用PHP做到页面注册审核
Mar 02 PHP
PHP 代码简洁之道(小结)
Oct 16 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 PHP
mysql limit查询优化分析
Nov 12 #PHP
令PHP初学者头疼十四条问题大总结
Nov 12 #PHP
PHP程序61条面向对象分析设计的经验小结
Nov 12 #PHP
Php Cookie的一个使用注意点
Nov 08 #PHP
MySql 按时间段查询数据方法(实例说明)
Nov 02 #PHP
php初学者写及时补给skype用户充话费的小程序
Nov 02 #PHP
php合并数组array_merge函数运算符加号与的区别
Oct 31 #PHP
You might like
用PHP动态生成虚拟现实VRML网页
2006/10/09 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
php设计模式 Observer(观察者模式)
2011/06/26 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
php 读取输出其他文件的实现方法
2016/07/26 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
IE8 浏览器Cookie的处理
2009/01/31 Javascript
javascript 自动填写表单的实现方法
2010/04/09 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
js使用栈来实现10进制转8进制与取除数及余数
2014/06/11 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
python统计一个文本中重复行数的方法
2014/11/19 Python
python对数组进行反转的方法
2015/05/20 Python
利用python为运维人员写一个监控脚本
2018/03/25 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
python re模块和正则表达式
2021/03/24 Python
办公室岗位职责
2015/02/04 职场文书
公积金具结保证书
2015/05/11 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
《火烧云》教学反思
2016/02/23 职场文书
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
通过Qt连接OpenGauss数据库的详细教程
2021/06/23 PostgreSQL
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技