• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 在MySQL中使用LIMIT进行分页的方法

在MySQL中使用LIMIT进行分页的方法

作者:吴炳锡 字体:[增加 减小] 来源:互联网 时间:2017-05-11

吴炳锡通过本文主要向大家介绍了mysql limit分页,mysql分页查询limit,mysql limit,mysql limit用法,mysql中limit用法等相关知识,希望本文的分享对您有所帮助

今天看一个水友说他的MySQL现在变的很慢。问什么情况时。说单表超过2个G的一个MyISAM。真垃圾的回答方式。

    简单答复:换一个强劲的服务器。换服务器很管用的:)

………
       最终让取到慢查询:
 

  SELECT * FROM pw_gbook WHERE uid='N' ORDER BY postdate DESC LIMIT N,N;
 
  SELECT * FROM pw_gbook WHERE uid='N' ORDER BY postdate DESC LIMIT N,N;
</div>

如:
   

SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20;
 
  SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20;
</div>

        看到这个语句我都吐血了(BT的PHPWIND分页啊,这个语句是PHP初学者写出来的还正常,但PHPWIND那么成熟的社区了还有这样的问题)。
        我这里简单说一下LIMIT的原理。这里以LIMIT N,M为基础:LIMIT首先要找查N+M行,然后从N行处,取M行。那么这样的SQL对一次查询1275500一个操作应该是一个昂贵的开销。对于LIMIT这类的优化,第一个目标就是让N变的尽可能的小或是不用。
     怎么才能使这个N尽可能小呢。我们能做的其实就是用相对的值,给分页一个提示。如现在我们看的是第5页,看完看想看第6页,第6页同样显示是20条记录。我们就可以想到,以这个例子为准:我们可以肯定的是第6页的日值应小于第5页的,如果第5页的最小日值为:2009-11-4,那我们就可以用:
    

SELECT * FROM pw_gbook WHERE uid='48' and postdate<'2009-11-1' ORDER BY postdate DESC LIMIT 20;
 
   SELECT * FROM pw_gbook WHERE uid='48' and postdate<'2009-11-1' ORDER BY postdate DESC LIMIT 20;
</div>

这样来查询第6页的内容。同样对于查看第4页的内容(假设第5页的最大日期为:2009-11-3)则第4页的内容为:
 

  SELECT * FROM pw_gbook WHERE uid='48' and postdate>'2009-11-3' ORDER BY postdate DESC LIMIT 20;


   SELECT * FROM pw_gbook WHERE uid='48' and postdate>'2009-11-3' ORDER BY postdate DESC LIMIT 20;

</div>

         这是一个基本的思想。接下来讨论一下怎么展现的问题。

         再说一下这种业务的SQL怎么实现:对于分页的展示可以用多用类型。这里说三种常用的类型:

第一种:显示“上一页” “下一页”这种类型

         这种方式相对简单也就出现了我们看到那种SQL不思考的写法。合理的做法:

         第一页:
     

SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 20;
 
   SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 20;
</div>

         第二页:根据第一页的postdate进行查询如:
      SELECT * FROM pw_gbook WHERE uid='48'  and postdate<'2009-11-3'  ORDER BY postdate DESC LIMIT  20;
 
      SELECT * FROM pw_gbook WHERE uid='48'  and postdate<'2009-11-3'  ORDER BY postdate DESC LIMIT  20;

         为什么说这个简单呢,这个不存在跳页的问题。接下来这种就存在一个跳页的问题了。

第二种:显示 “ 1,2,3,4,5…”

         第一页: 还是以第一页的方式实现:
        

 SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 20;
 
     SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 20;
</div>

         第二页:和原来一样。如果跳页,如从第二页跳到第5页,这里有一个第二页的最小日期为:2009-11-3(假设值,可以由第二页的程序查询得到),第二到第5,差2页,每页20条记录,那么就可以用:

SELECT * FROM pw_gbook WHERE uid='48' and postdate<'2009-11-3' ORDER BY postdate DESC LIMIT 40,20;


SELECT * FROM pw_gbook WHERE uid='48' and postdate<'2009-11-3' ORDER BY postdate DESC LIMIT 40,20;

</div>

        看到这里明白为什么大型网站的分页不是一下标识出来完了,让都能点了吧。也不会给你一个框让你输入一个页跳过去了。如果跳的页面过多,也就存在N值过大的问题了。所以要想办法必免。

第三种:显示 “1,2,3,4,5,…. 末页” 或是 “首页,<<100,101,102,103 >>末页”

这里有一个特殊的一地方:

别的页面的跳转的上面一样。这里就加一个末页,这里又分两种情况,如果知道最后一页是多少页,也就知道了前一页的最小日期(分页提示值),这样就可以用上面的方法查看最后一页的内容(会出现不足20条的现象),另一种,我就不知道最后是第几页,我就是想看看最后什么样子,那么就可以用(一定是显示20条):

SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate ASC limit 20;
 
SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate ASC limit 20;
</div>

         首页这里就不在说了。

       

         具体怎么实现搞明白了,就可以做PHP代码的修改了。稍稍修改一下,就会带来意想不到的效果。

 

这里只是一个通用的分页处理方法。不同的业务有可能还有不同的方法处理。如果在条件可能和情况可以考用:between … and .. 带代替limit分页操作。

第三种方法:       
简单的逻辑转换。
  

SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20;
 
  SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20;
</div>

转换成:
  

SELECT * FROM pw_gbook WHERE id>1275480 and uid='48' ORDER BY postdate DESC LIMIT 20;
 
  SELECT * FROM pw_gbook WHERE id>1275480 and uid='48' ORDER BY postdate DESC LIMIT 20;
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • MySQL查询优化:连接查询排序limit(join、order by、limit语句)介绍
  • mysql limit分页优化方法分享
  • 在MySQL中使用LIMIT进行分页的方法
  • Mysql子查询IN中使用LIMIT应用示例
  • MySql中取前几行数据使用limit来完成

相关文章

  • 2018-12-05几个常用的mysql截取函数
  • 2017-05-11用Autoconf检测MySQL软件包的教程
  • 2018-12-05标准MySQL数据库外的5个开源兼容方案
  • 2018-12-05如何修改WAMP中mysql默认空密码的方法
  • 2018-12-05mysql其他函数
  • 2017-05-11mysql中TINYINT的取值范围
  • 2018-12-05修复断电等损坏的SQL数据库
  • 2018-12-05oracle下实现恢复一个丢失的数据文件的代码
  • 2017-05-11开源MySQL高效数据仓库解决方案:Infobright详细介绍
  • 2018-12-05Mysql 插入中文及中文查询 (修改+调试)

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • oracle 声明游标(不具备字段)规则应用
    • 数据从mysql迁移到hbase的一些思考及设计
    • mysql 前几条记录语句之(limit)
    • PDO中执行SQL语句
    • mysql实现自动监控同步的脚本
    • 删除重复记录,并且剩下一条
    • mysql 分页 count 查询效率低下分析
    • SQLServer 2008中通过DBCC OPENTRAN和会话查询事务
    • 利用ssh tunnel链接mysql服务器的方法分享
    • MySQL · 引擎特性 · InnoDB IO子系统的详情介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有