关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » MySQL »Mysql LIMIT如何正确对其进行优化

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

    2010-05-17 17:09:00 出处:ITJS
    分享

    以下的文章主要是对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.

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    电脑屏幕不小心竖起来了?别慌,快捷键搞定

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    IT头条

    Synology 更新 ActiveProtect Manager 1.1 以增强企业网络弹性和合规性

    00:43

    新的 Rubrik Agent Cloud 加速了可信的企业 AI 代理部署

    00:34

    宇树科技 G1人形机器人,拉动一辆重达1.4吨的汽车

    00:21

    Cloudera 调查发现,96% 的企业已将 AI 集成到核心业务流程中,这表明 AI 已从竞争优势转变为强制性实践

    02:05

    投资者反对马斯克 1 万亿美元薪酬方案,要求重组特斯拉董事会

    01:18

    技术热点

    大型网站的 HTTPS 实践(三):基于协议和配置的优化

    ubuntu下右键菜单添加新建word、excel文档等快捷方式

    Sublime Text 简明教程

    用户定义SQL Server函数的描述

    怎么在windows 7开始菜单中添加下载选项?

    SQL Server 2016将有哪些功能改进?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。