`
willko
  • 浏览: 387087 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mysql分页limit 优化

阅读更多
mysql的分页比较简单,只需要limit offset,length就可以获取数据了,但是当offset和length比较大的时候,mysql明显性能下降

1.子查询优化法
先找出第一条数据,然后大于等于这条数据的id就是要获取的数据
缺点:数据必须是连续的,可以说不能有where条件,where条件会筛选数据,导致数据失去连续性

实验下
mysql> set profiling=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from Member;
+----------+
| count(*) |
+----------+
|   169566 | 
+----------+
1 row in set (0.00 sec)

mysql> pager grep !~-
PAGER set to 'grep !~-'

mysql> select * from Member limit 10, 100;
100 rows in set (0.00 sec)

mysql> select * from Member where MemberID >= (select MemberID from Member limit 10,1) limit 100;
100 rows in set (0.00 sec)

mysql> select * from Member limit 1000, 100;
100 rows in set (0.01 sec)

mysql> select * from Member where MemberID >= (select MemberID from Member limit 1000,1) limit 100;
100 rows in set (0.00 sec)

mysql> select * from Member limit 100000, 100;
100 rows in set (0.10 sec)

mysql> select * from Member where MemberID >= (select MemberID from Member limit 100000,1) limit 100;
100 rows in set (0.02 sec)

mysql> nopager
PAGER set to stdout


mysql> show profiles\G
*************************** 1. row ***************************
Query_ID: 1
Duration: 0.00003300
   Query: select count(*) from Member

*************************** 2. row ***************************
Query_ID: 2
Duration: 0.00167000
   Query: select * from Member limit 10, 100
*************************** 3. row ***************************
Query_ID: 3
Duration: 0.00112400
   Query: select * from Member where MemberID >= (select MemberID from Member limit 10,1) limit 100

*************************** 4. row ***************************
Query_ID: 4
Duration: 0.00263200
   Query: select * from Member limit 1000, 100
*************************** 5. row ***************************
Query_ID: 5
Duration: 0.00134000
   Query: select * from Member where MemberID >= (select MemberID from Member limit 1000,1) limit 100

*************************** 6. row ***************************
Query_ID: 6
Duration: 0.09956700
   Query: select * from Member limit 100000, 100
*************************** 7. row ***************************
Query_ID: 7
Duration: 0.02447700
   Query: select * from Member where MemberID >= (select MemberID from Member limit 100000,1) limit 100


从结果中可以得知,当偏移1000以上使用子查询法可以有效的提高性能。


2.倒排表优化法
倒排表法类似建立索引,用一张表来维护页数,然后通过高效的连接得到数据

缺点:只适合数据数固定的情况,数据不能删除,维护页表困难

具体请看,http://blog.chinaunix.net/u/29134/showart_1333566.html

3.反向查找优化法
当偏移超过一半记录数的时候,先用排序,这样偏移就反转了

缺点:order by优化比较麻烦,要增加索引,索引影响数据的修改效率,并且要知道总记录数
,偏移大于数据的一半

引用
limit偏移算法:
正向查找: (当前页 - 1) * 页长度
反向查找: 总记录 - 当前页 * 页长度


做下实验,看看性能如何

总记录数:1,628,775
每页记录数: 40
总页数:1,628,775 / 40 = 40720
中间页数:40720 / 2 = 20360

第21000页
正向查找SQL:
SELECT * FROM `abc` WHERE `BatchID` = 123 LIMIT 839960, 40

时间:1.8696 秒

反向查找sql:
SELECT * FROM `abc` WHERE `BatchID` = 123 ORDER BY InputDate DESC LIMIT 788775, 40

时间:1.8336 秒

第30000页
正向查找SQL:
SELECT * FROM `abc` WHERE `BatchID` = 123 LIMIT 1199960, 40

时间:2.6493 秒

反向查找sql:
SELECT * FROM `abc` WHERE `BatchID` = 123 ORDER BY InputDate DESC LIMIT 428775, 40

时间:1.0035 秒

注意,反向查找的结果是是降序desc的,并且InputDate是记录的插入时间,也可以用主键联合索引,但是不方便。


4.limit限制优化法
把limit偏移量限制低于某个数。。超过这个数等于没数据,我记得alibaba的dba说过他们是这样做的

5.只查索引法
http://willko.iteye.com/blog/670120

总结:limit的优化限制都比较多,所以实际情况用或者不用只能具体情况具体分析了。页数那么后,基本很少人看的。。。

8
2
分享到:
评论
1 楼 cevin 2010-08-08  
引用
总结:limit的优化限制都比较多,所以实际情况用或者不用只能具体情况具体分析了。页数那么后,基本很少人看的。。。
对于论坛来说,前3页和最后5页是浏览量最高的.如果对实时性要求不高,可以考虑做缓存.(Dz的缓存做的很人性化).反之,则是优化的重点. 

相关推荐

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

    以下是一些针对MySQL `LIMIT` 分页速度慢的优化方法: 1. **避免大`OFFSET`值**: 当`OFFSET`值很大时,MySQL会跳过很多行才能到达需要返回的数据。例如,`LIMIT 200000, 10`需要扫描200010行,这是非常低效的。...

    mysql分页之limit优化技巧

    本文档针对mysql分页之limit慢的问题,使用联合索引在大数据量的情况下优化limit分页的性能

    mysql分页的limit参数简单示例

    Mysql的分页的两个参数 select * from user limit 1,2 ... 您可能感兴趣的文章:详解MySQL的limit用法和分页查询语句的性能分析MYSQL分页limit速度太慢的优化方法mysql limit分页优化方法分享Mysql limit

    关于Mysql分页的两种方法,假分页和limit分页

    相比之下,LIMIT分页是MySQL数据库内置的分页机制,它在服务器端直接处理分页,只返回所需页面的数据。LIMIT关键字与ORDER BY一起使用,可以实现高效的数据分页。例如,`SELECT * FROM table ORDER BY column LIMIT ...

    如何优化Mysql千万级快速分页

    MySQL 千万级快速分页优化方案 在实际开发中,我们经常会遇到 MySQL 数据库的性能问题,特别是在处理千万级数据时,分页查询的性能会变得非常慢。在这篇文章中,我们将探讨如何优化 MySQL 千万级快速分页,详细介绍...

    Mysql Limit 分页查询优化详解

    总的来说,MySQL LIMIT分页查询的优化主要集中在减少不必要的行扫描、利用索引以及采用更适合大数据量的查询策略。通过这些方法,可以显著提升分页查询的性能,尤其是对于那些需要跳过多行的情况。在实际应用中,应...

    高效的MySQL分页

    总结来说,实现高效的MySQL分页查询需要考虑索引优化、使用新的SQL特性,以及借助合适的开发工具。同时,持续关注数据库性能监控,及时调整和优化查询策略,对于保持系统稳定和提升用户体验具有重要意义。

    mysql数据库实现分页

    总结,MySQL的分页功能是处理大数据量查询的关键技术,通过合理使用`LIMIT`和`OFFSET`,配合索引优化,可以有效地提高查询效率,提升用户交互体验。同时,随着版本升级,MySQL提供了更多分页策略和技术,如窗口函数...

    nodejs mysql 实现分页的方法

    分页可以有效提高页面的响应速度,并优化用户的浏览体验。本文主要介绍了在Node.js环境下,如何使用MySQL数据库实现分页功能。 首先,分页的基本思路是确定每页显示的数据条目数(即页面大小),然后根据当前页码...

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

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

    winform mysql 分页

    本示例中,我们将探讨如何在WinForm应用程序中实现MySQL数据库的分页功能,这在处理大量数据时非常实用,可以提高用户体验并减少系统资源的消耗。 首先,我们需要在Visual Studio 2010中创建一个新的WinForm项目。...

    JSP+MySql分页组件

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

    PHP MYSQL分页代码

    本资源"PHP MYSQL分页代码"提供了一个实用的解决方案,结合了PHP和MySQL两种技术来实现高效的数据分页功能。 首先,让我们深入了解PHP和MySQL在分页中的角色。PHP是一种广泛使用的服务器端脚本语言,常用于动态网站...

    asp mysql分页(超完美版本)

    ### ASP与MySQL分页技术详解 #### 一、引言 在Web开发中,当数据量庞大时,一次性展示所有数据不仅会导致页面加载缓慢,还会严重影响用户体验。因此,实现数据的分页显示变得尤为重要。本文将详细介绍如何在ASP...

    java-web-mysql 分页demo

    二、MySQL分页查询 在MySQL中,我们可以使用`LIMIT`和`OFFSET`关键字来实现分页。`LIMIT`用于指定每页显示的数据条数,`OFFSET`用于指定从哪一条记录开始取数据。例如,要获取第2页(每页5条数据)的信息,SQL语句...

    mysql 分页源代码

    在IT行业中,数据库查询的效率和用户体验是至关重要的,特别...通过对这些文件的学习和理解,开发者可以掌握如何在实际项目中实现基于JSP、JavaBean、JDBC和MySQL的分页功能,从而优化数据库查询并提供更好的用户体验。

    mysql分页实例

    在这个"mysql分页实例"中,我们将深入探讨MySQL的分页查询技术,并提供可以直接引用的分页类。 首先,我们要理解SQL中的基础分页查询语句。在MySQL中,最常用的分页查询方法是结合`LIMIT`和`OFFSET`关键字。`LIMIT`...

    JDBC-MySQL分页查询

    在MySQL中,我们可以使用`LIMIT`和`OFFSET`子句实现分页。`LIMIT`指定每页显示的记录数,而`OFFSET`指定位移量,即跳过多少条记录开始返回结果。例如,如果我们想获取第2页,每页显示10条记录,SQL语句可能如下: `...

Global site tag (gtag.js) - Google Analytics