使用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中$_SERVER的详细参数与说明
Jul 29 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 PHP
PHP 转义使用详解
Jul 15 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
Aug 28 PHP
PHP引用返回用法示例
May 28 PHP
php mysqli查询语句返回值类型实例分析
Jun 29 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
Aug 01 PHP
微信小程序 消息推送php服务器验证实例详解
Mar 30 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
php app支付宝回调(异步通知)详解
Jul 25 PHP
Yii 框架使用Forms操作详解
May 18 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 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
新手学习PHP的一些基础知识分享
2011/07/27 PHP
Parse正式发布开源PHP SDK
2014/08/11 PHP
PHP中feof()函数实例测试
2014/08/23 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
JS 控制小数位数的实现代码
2011/08/02 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
详解webpack分离css单独打包
2017/06/21 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
vue中本地静态图片路径写法
2018/03/06 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
Python中给List添加元素的4种方法分享
2014/11/28 Python
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
Python内置函数reversed()用法分析
2018/03/20 Python
Python交互环境下实现输入代码
2018/06/22 Python
selenium+python实现自动化登录的方法
2018/09/04 Python
python调用c++传递数组的实例
2019/02/13 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
STAUD官方网站:洛杉矶独有的闲适风格
2019/04/11 全球购物
英语自荐信常用语句
2013/12/13 职场文书
临床医学专业求职信
2014/08/08 职场文书
职工小家建设活动方案
2014/08/25 职场文书
党员查摆剖析材料
2014/10/10 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server