`
flowercat
  • 浏览: 362291 次
社区版块
存档分类
最新评论

(转)基于MySQL5.0中limit的高性能分析

阅读更多
基于MySQL5.0中limit的高性能分析.

1.
Select * From cyclopedia Where ID>=(
Select Max(ID) From (
Select ID From cyclopedia Order By ID limit 90001
) As tmp
) limit 100;

2.
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的limit就有优势的多,执行:
Select ID From cyclopedia limit 90000
Select ID From cyclopedia limit 90000,1
的结果分别是:
90000 rows in set (0.36) sec
1 row in set (0.06) sec
而MS-SQL只能用Select Top 90000 ID From cyclopedia 执行时间是390ms,执行同样的操作时间也不及MySQL的360ms.
分享到:
评论

相关推荐

    MySql5.0使用手册

    MySQL 5.0是世界上最流行的开源关系型数据库管理系统之一,其功能强大且易于使用,尤其在Web应用程序开发中被广泛采用。本使用手册将详细解析MySQL 5.0的各项核心功能,帮助用户从安装配置到实际操作,全面掌握MySQL...

    ACCP5.0 S2上机考试复习题

    常见的分页方法有LIMIT与OFFSET组合在MySQL中,或者使用ROW_NUMBER()函数在SQL Server中。 复习这部分内容,考生应了解如何编写有效的SQL语句,如SELECT、FROM、WHERE、GROUP BY、ORDER BY等,同时理解JOIN操作用于...

    mysql-connector-java-5.1.48.tar.gz

    3. 高性能:该版本优化了网络通信和SQL解析,提高了数据读写速度,减少了延迟,增强了大规模并发操作的能力。 4. 安全性:支持SSL加密连接,确保数据传输的安全性。同时,提供了用户权限管理和角色管理,防止未授权...

    mysql导入导出数据库文件

    **MySQL GUITools v5.0** 是一套强大的可视化工具集,包含了多种图形化应用程序,能够帮助用户更高效地管理MySQL数据库。这些工具不仅简化了数据库的操作流程,还使得即使是不具备丰富SQL语言知识的用户也能轻松完成...

    mysql从入门到提高的精华个人笔记.zip

    "[学习笔记]MySQL5.0安装图解.docx"则提供了具体的MySQL 5.0版本的安装步骤,可能包括下载安装包、安装向导、设置服务器类型、创建默认账户等细节。安装图解有助于初学者避免常见的安装错误,快速上手。 最后,"...

    mysql-connector-java-5.1.30工具

    1. **兼容性**:此版本的驱动支持MySQL服务器版本5.0至5.7,这为开发者提供了广泛的数据库版本选择。 2. **JDBC 4.1规范**:遵循JDBC 4.1标准,提供更好的性能和功能,包括异步操作和新的SQL注解支持。 3. **优化的...

    掌握ThinkPHP5.0数据库和模型【官方】.zip

    《掌握ThinkPHP5.0数据库和模型》是...总结,掌握ThinkPHP5.0的数据库和模型操作,能够帮助开发者高效地处理数据,构建高性能的Web应用。通过深入学习这些知识点,可以提升开发效率,同时保证代码的安全性和稳定性。

    使用MySQL Slow Log来解决MySQL CPU占用高的问题

    总之,MySQL Slow Log是定位和解决MySQL性能问题的利器,通过合理地分析和优化,可以有效降低CPU占用,提升系统整体性能。在日常运维中,定期监控和分析Slow Log是保持数据库高效运行的重要步骤。

    PHP5 apache服务器配置

    - 用于部署和管理PHP应用程序的高性能平台。 2. **Zend Studio:** - 一款功能强大的PHP集成开发环境(IDE)。 通过以上步骤,你就可以成功地配置出一个完整的PHP5 + Apache + MySQL + phpMyAdmin开发环境,并...

    实用的struts2分页

    - **数据库**:MySQL 5.0 - **框架**:Struts2 2.0.11 首先,确保项目中包含了Struts2的核心jar包以及其他依赖库。接着,在`web.xml`中配置Struts2过滤器,以便拦截所有请求并交由Struts2处理。以下是`web.xml`的...

    jsp实验手册

    这通常涉及到SQL的LIMIT或OFFSET子句,以及在JSP中处理页码和记录数。 实验七:WEB界面配置TOMCAT连接池 介绍如何在Tomcat中配置连接池,如Apache Commons DBCP或C3P0,以优化数据库连接的管理和复用,提高系统性能...

    简单介绍下 PHP5 中引入的 MYSQLI的用途

    或 "incomplete",意味着它是一个改进版的接口,旨在提供更好的性能、兼容性和灵活性,同时也承认在开发过程中可能存在不完整或不兼容的情况,因为当时 MySQL 4.1 和 5.0 版本还在发展阶段。 mysqli 想要实现的主要...

Global site tag (gtag.js) - Google Analytics