MySQL分页技术、6种分页方法总结

 更新时间:2015年07月02日 11:34:46   投稿:junjie  
这篇文章主要介绍了MySQL分页技术、6种分页方法总结,本文总结了6种分页的方法并分别一一讲解它们的特点,需要的朋友可以参考下

概述

有朋友问: MySQL的分页似乎一直是个问题,有什么优化方法吗?
网上看到赶集网XX推荐了一些分页方法,但似乎不太可行,你能点评一下吗?

方法总结

方法1: 直接使用数据库提供的SQL语句

语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N
适应场景: 适用于数据量较少的情况(元组百/千级)
原因/缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是从结果集的M位置处取出N条输出,其余抛弃.

方法2: 建立主键或唯一索引, 利用索引(假设每页10条)

语句样式: MySQL中,可用如下方法: SELECT FROM 表名称 WHERE id_pk > (pageNum10) LIMIT M
适应场景: 适用于数据量多的情况(元组数上万)
原因: 索引扫描,速度会很快. 有朋友提出: 因为数据查询出来并不是按照pk_id排序的,所以会有漏掉数据的情况,只能方法3

方法3: 基于索引再排序

语句样式: MySQL中,可用如下方法: SELECT FROM 表名称 WHERE id_pk > (pageNum10) ORDER BY id_pk ASC LIMIT M
适应场景: 适用于数据量多的情况(元组数上万). 最好ORDER BY后的列对象是主键或唯一所以,使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1)
原因: 索引扫描,速度会很快. 但MySQL的排序操作,只有ASC没有DESC(DESC是假的,未来会做真正的DESC,期待…).

方法4: 基于索引使用prepare(第一个问号表示pageNum,第二个?表示每页元组数)
语句样式: MySQL中,可用如下方法: PREPARE stmt_name FROM SELECT FROM 表名称 WHERE id_pk > (? ?) ORDER BY id_pk ASC LIMIT M
适应场景: 大数据量
原因: 索引扫描,速度会很快. prepare语句又比一般的查询语句快一点。

方法5: 存储过程类(最好融合上述方法4)

语句样式: 不再给出
适应场景: 大数据量. 作者推荐的方法
原因: 把操作封装在服务器,相对更快一些。

方法6: 反面方法

网上有人写使用 SQL_CALC_FOUND_ROWS。 没有道理,勿模仿

相关文章

  • 导致sql执行速度慢的几种情况盘点(生产环境踩过的坑)

    导致sql执行速度慢的几种情况盘点(生产环境踩过的坑)

    盘点分析MySQL执行速度慢可以帮助我们进行优化MySQL数据库的效率,这篇文章主要给大家盘点介绍了关于导致sql执行速度慢的几种情况,文中介绍的这些主要是生产环境踩过的坑,需要的朋友可以参考下
    2023-03-03
  • mysql服务器查询慢原因分析与解决方法小结

    mysql服务器查询慢原因分析与解决方法小结

    在开发的朋友特别是和mysql有接触的朋友会碰到有时mysql查询很慢,当然我指的是大数据量百万千万级了,不是几十条了,下面我们来看看解决查询慢的办法
    2012-04-04
  • MYSQL函数的使用梳理

    MYSQL函数的使用梳理

    本篇文章讲解是是MySQL的函数方法,涵盖所有的MySQL常见的方法,MySQL函数,是一种控制流程函数,属于数据库用语言,以下列出了这些函数的说明
    2022-05-05
  • 解决MySQL报错1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPL问题

    解决MySQL报错1267 - Illegal mix of coll

    这篇文章主要给大家介绍了解决MySQL报错1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPL的问题,文中有详细的解决方案,需要的朋友可以参考下
    2023-09-09
  • MySQL窗口函数的具体使用

    MySQL窗口函数的具体使用

    本文主要介绍了MySQL窗口函数的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • MySQL索引优化之分页探索详细介绍

    MySQL索引优化之分页探索详细介绍

    大家好,本篇文章主要讲的是MySQL索引优化之分页探索详细介绍,感兴趣的同学赶快来看看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • MyBatis中实现动态SQL标签

    MyBatis中实现动态SQL标签

    动态SQL是MyBatis的一项强大功能,它允许开发者根据条件动态地生成SQL语句,本文主要介绍了MyBatis中实现动态SQL标签,感兴趣的可以可以了解一下
    2024-09-09
  • 使用Rotate Master实现MySQL 多主复制的实现方法

    使用Rotate Master实现MySQL 多主复制的实现方法

    众所周知,MySQL只支持一对多的主从复制,而不支持多主(multi-master)复制
    2012-05-05
  • 浅析MySQL 主键使用数字还是uuid查询快

    浅析MySQL 主键使用数字还是uuid查询快

    在实际开发中可能会生成uuid作为主键那么疑问来了,到底MySQL 主键使用数字还是uuid查询快呢?下面小编给大家带来实例代码给大家详细介绍,感兴趣的朋友跟随小编一起看看吧
    2021-08-08
  • mysql使用GROUP BY分组实现取前N条记录的方法

    mysql使用GROUP BY分组实现取前N条记录的方法

    这篇文章主要介绍了mysql使用GROUP BY分组实现取前N条记录的方法,结合实例形式较为详细的分析了mysql中GROUP BY分组的相关使用技巧,需要的朋友可以参考下
    2016-06-06

最新评论