`

(转:经测试,分页效率明显提升)验证使用子查询提高MySQL分页效率

 
阅读更多

验证使用子查询提高MySQL分页效率

作者:老王

很久以前,我写过一篇文章,说明了MySQL下的几种分页方式。这些天,陆续有几个人问过我其中的子查询方式,并对子查询分页的高效率表示质疑。今天我特意做了一个试验来验证这一点。

我选择了公司一个Discuz测试论坛作为试验体,其cdb_posts的记录数接近10000000行。

注意:如果想避免缓存的影响,可以使用SQL_NO_CACHE的方式:SELECT SQL_NO_CACHE ...

先验证最基本的分页方式:

在PhpMyAdmin里执行如下SQL:

SELECT * FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 30
多执行几次,避免Cache等影响,取平均值,其执行时间大约为:6.6140 秒

再验证子查询的分页方式:

在PhpMyAdmin里执行如下SQL:

SELECT * FROM `cdb_posts` WHERE pid >= (
SELECT pid FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 1
) LIMIT 30
同样多执行几次,避免Cache等影响,取平均值,其执行时间大约为:0.6049 秒

=================

其实效率的差别就在于以下两种方式的差别:

SELECT * FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 1(6.7732 秒
SELECT pid FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 1(0.5838 秒

有网友说如果是MySQL静态表的话,两个查询的速度应该基本一样,到底是不是我再做实验验证一下,同样是上面所用的表,只是删除了所有的varchar, text之类的变长度字段,以保证其是静态表,然后执行:

SELECT * FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 1(2.1303 秒
SELECT pid FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 1(0.5532 秒

可以发现,转换成静态表之后,SELECT *后的速度确实快了一些,但查询速度仍然处于秒的级别,可以说还是很慢的。

综上所述:当限定了字段,并且这个字段是一个索引的时候,LIMIT可以直接在索引文件中查找,而不是在实际的数据文件中查找,所以需要“跨越”的数据块体积要小很多。不过感觉这本应该可以在MySQL内部得到透明的优化才对,或许是因为MySQL的优化器比较笨吧。

BTW:顺便要说一个事儿,就是搜索引擎的问题,在分页的时候,有时候要考虑搜索引擎的影响,比如你的数据一共有一万页,如果你不做限制的话,搜索引擎的爬虫会傻乎乎的一直检索下去,有时候检索到大分页的时候,就可能会给服务器负载造成负担,我们在尽可能提供分页效率的同时,也应该考虑一些其他的方式来限制爬虫的行为,比如说,我们可以限制一百页以后的分页必须是登陆状态下的用户才能访问,如此既没有严重影响用户体验,也屏蔽了爬虫造成的不必要的负载。
分享到:
评论

相关推荐

    查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题.doc

    5. 优化查询:使用子查询和 inner join 关联查询来解决深分页问题。 解决方案: 6. 使用子查询:用子查询查出符合条件的主键,再用主键 ID 做条件查出所有字段,执行时间缩短到 0.05 秒,减少了 0.12 秒,相当于...

    JSP+JavaBean实现MySQL子查询数据库分页

    本教程将详细讲解如何使用JSP(JavaServer Pages)配合JavaBean来实现MySQL数据库的子查询分页功能。在Eclipse 3.4环境下,我们可以轻松地完成这一过程。 首先,我们需要理解JSP和JavaBean的基本概念。JSP是一种...

    java语言的分页查询功能(mysql和sql server)

    2. 使用ROW_NUMBER()优化:在SQL Server中,使用`ROW_NUMBER()`结合子查询可以避免`OFFSET`的性能问题,尤其是在大数据量时。 3. 计算总页数:在Java中,通常需要计算总页数,可以通过单独查询获取总记录数再除以每...

    MySQL百万级数据量分页查询方法及其优化建议

    测试结果显示,随着分页起始位置的增加,直接使用LIMIT语句的查询效率明显下降。因此,对于大型数据集,应优先考虑使用索引优化和预编译语句等方法。 优化策略还包括: - **优化查询语句**:避免全表扫描,确保...

    MySQL大数据量分页查询方法及其优化

    - **原因**:通过子查询或连接的方式,结合索引的使用,可以在避免全表扫描的同时,实现对目标记录的精准定位。 ### 测试实验 下面通过一个简单的测试实验来直观地展示不同分页查询方法之间的性能差异: - **直接...

    MySQL 百万级分页优化(Mysql千万级快速分页)

    ### MySQL 百万级分页优化(Mysql千万级快速分页) #### 背景与挑战 在处理大规模数据集时,例如拥有数百万乃至数千万条记录的数据库表,传统的分页查询方法可能会遇到性能瓶颈。特别是使用`LIMIT`进行分页时,随着...

    mybatis插件分页测试

    优化策略包括使用子查询获取总记录数,避免多次扫描表,以及合理设置缓存等。 通过以上步骤,我们可以实现MyBatis插件的分页功能。在实际开发中,应结合项目需求选择合适的分页策略,并注意性能优化,以提供高效且...

    JSP+MySql分页组件

    【JSP+MySQL分页组件】是Web开发中常见的功能,用于处理大量数据时提高页面加载速度和用户体验。在Web应用程序中,一次性加载所有数据可能导致页面响应慢,尤其是在数据库存储的数据量庞大的情况下。分页技术可以...

    分页语义接口,有mysql的实现

    因此,可以考虑使用`ROW_NUMBER()`窗口函数或`JOIN`子查询等策略来优化。但这些优化方法可能需要MySQL的特定版本或特定配置。 5. **语义化接口**:这里的“分页语义接口”可能指的是将分页逻辑封装在服务层,使得...

    MYSQL分页limit速度太慢的优化方法

    MySQL中的分页查询是Web应用中常见的操作,但随着数据量的增长,`LIMIT`语句在处理大量数据时性能会显著下降。特别是当`OFFSET`值增大时,MySQL需要扫描更多的行来找到需要的数据,这可能导致查询速度变慢,甚至对...

    mySql与oracle分页技术

    因此,对于大数据分页,更推荐使用基于主键的排序和范围查询来提高效率。 Oracle数据库的分页技术有所不同。Oracle没有直接提供类似`LIMIT`的语法,但它可以通过`ROWNUM`伪列或者结合`FETCH NEXT`和`OFFSET`子句来...

    MySQL分页实现

    - **避免全表扫描**:如果可能,使用`IN`子查询或`JOIN`代替`OFFSET`,以减少全表扫描。 - **预估页数**:在用户滚动到底部加载更多数据时,可以提前计算出下一页的ID范围,减少不必要的查询。 4. **MySQL分页工具*...

    MySQL千万级大表深度分页为什么慢,以及优化的方法、原理

    这是因为MySQL的查询优化器在面对大量数据的分页请求时,可能选择全表扫描而不是利用索引来提高效率。这个问题在描述中的例子中得到了体现,当尝试获取数据集的远端分页时,查询速度显著降低。 1. **分页查询原理:...

    mybatis mysql分页实例(不能用找我)

    本实例将详细介绍如何在MyBatis中实现MySQL的分页查询,帮助开发者提高应用性能,提升用户浏览数据的体验。 首先,我们要理解分页的基本概念。分页是将大量数据分成多个小部分,每次只加载一部分到内存中,这样可以...

    万能存储过程分页,搞效率分页

    4. **子查询或连接**:利用子查询或连接来预先计算每个页码的起始ID,然后直接通过ID获取数据,提高效率。 5. **缓存**:对于静态或更新不频繁的分页结果,可以考虑缓存,减少数据库查询。 压缩包中的"万能存储...

    sqlserver,mysql,oracle三种数据库的分页查询

    MySQL中使用的是`LIMIT`关键字,配合`OFFSET`或子查询来实现分页。同样,我们先看如何获取第一页: ```sql SELECT * FROM TableName ORDER BY SomeColumn DESC LIMIT 10 ``` 要获取第二页,可以这样写: ```sql ...

    mysql+spring mvc 实现分页

    2. **索引优化**:为经常用于分页查询的字段创建索引,提高查询速度。 3. **Count查询**:对于总页数的计算,可以考虑使用SQL的`COUNT(*) OVER()`窗口函数或预计算存储总记录数。 六、Spring MVC中的其他操作 除了...

    大数据量多线程执行分页查询

    2. **实现分页查询**:使用SQL的`LIMIT`(MySQL)或`OFFSET/FETCH`(SQL Server)等语句进行分页,确保每次只获取一部分数据。 3. **创建线程池**:利用C#的`ThreadPool`或`Task`来创建线程,每个线程负责处理一个...

    Java实现分页查询

    在Java编程中,分页查询是一项非常常见的任务,特别是在处理大量数据时,为了提高用户体验和系统性能,我们通常不会一次性加载所有数据,...此外,对于大数据量的分页,还应考虑缓存策略和索引优化,以提升查询效率。

    mysql.rar_MYSQL_分页

    综上,MySQL的分页查询不仅涉及到基础的LIMIT和OFFSET用法,还涵盖了许多优化技巧,包括窗口函数、自连接、子查询以及索引优化等。理解和熟练应用这些方法,对于提升数据库性能和用户体验至关重要。

Global site tag (gtag.js) - Google Analytics