MySQL的分页技术总结

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 有朋友问: MySQL的分页似乎一直是个问题,有什么优化方法吗? 网上看到赶集网XX推荐了一些分页方法,但似乎不太可行,你能点评一下吗? =========================================---方法1: 直接使用数据库提供的SQL语句 --...
有朋友问: 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 > (pageNum*10) LIMIT M
---适应场景:
适用于数据量多的情况(元组数上万)
---原因: 索引扫描,速度会很快. 有朋友提出:
因为数据查询出来并不是按照pk_id排序的,所以会有漏掉数据的情况,只能方法3


---方法3: 基于索引再排序
---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称
WHERE id_pk > (pageNum*10) 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:
利用MySQL支持ORDER操作可以利用索引快速定位部分元组,避免全表扫描


比如: 读第1000到1019行元组(pk是主键/唯一键).


SELECT * FROM your_table WHERE pk>=1000 ORDER BY pk ASC LIMIT 0,20


---方法6: 利用"子查询/连接+索引"快速定位元组的位置,然后再读取元组. 道理同方法5


如(id是主键/唯一键,蓝色字体时变量):


利用子查询示例:


SELECT * FROM your_table WHERE id (SELECT id FROM your_table ORDER
BY id desc LIMIT ($page-1)*$pagesize ORDER BY id desc
LIMIT $pagesize


利用连接示例:


SELECT * FROM your_table AS t1
JOIN (SELECT id FROM your_table ORDER BY
id desc LIMIT ($page-1)*$pagesize AS t2
WHERE
t1.id $pagesize;


---方法7: 存储过程类(最好融合上述方法5/6)
---语句样式:
不再给出
---适应场景: 大数据量.  作者推荐的方法
---原因: 把操作封装在服务器,相对更快一些。


---方法8: 反面方法
---网上有人写使用
SQL_CALC_FOUND_ROWS。 没有道理,勿模仿 


基本上,可以推广到所有数据库,道理是一样的.但方法5未必能推广到其他数据库,推广的前提是,其他数据库支持ORDER
BY操作可以利用索引直接完成排序.

1.http://imysql.com/2014/07/26/mysql-optimization-case-paging-optimize.shtml
2.http://www.vmcd.org/2014/07/advance-for-mysql-pagination/
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
存储 关系型数据库 MySQL
mysql数据库查询时用到的分页方法有哪些
【8月更文挑战第16天】在MySQL中,实现分页的主要方法包括:1)使用`LIMIT`子句,简单直接但随页数增加性能下降;2)通过子查询优化`LIMIT`分页,提高大页码时的查询效率;3)利用存储过程封装分页逻辑,便于复用但需额外维护;4)借助MySQL变量实现,可能提供更好的性能但实现较复杂。这些方法各有优缺点,可根据实际需求选择适用方案。
126 2
|
1月前
|
监控 关系型数据库 MySQL
10亿数据如何最快速插入MySQL:技术干货分享
【8月更文挑战第2天】在大数据时代,处理并快速插入数十亿条数据到MySQL数据库是许多企业面临的关键挑战。本文将深入分享一系列高效的技术策略和实战经验,帮助读者优化这一过程,确保数据能够快速、准确地进入数据库系统。
100 1
|
7天前
|
算法 关系型数据库 MySQL
MySQL高级篇——排序、分组、分页优化
排序优化建议、案例验证、范围查询时索引字段选择、filesort调优、双路排序和单路排序、分组优化、带排序的深分页优化
MySQL高级篇——排序、分组、分页优化
|
4天前
|
存储 关系型数据库 MySQL
技术解析:MySQL中取最新一条重复数据的方法
以上提供的两种方法都可以有效地从MySQL数据库中提取每个类别最新的重复数据。选择哪种方法取决于具体的使用场景和MySQL版本。子查询加分组的方法兼容性更好,适用于所有版本的MySQL;而窗口函数方法代码更简洁,执行效率可能更高,但需要MySQL 8.0及以上版本。在实际应用中,应根据数据量大小、查询性能需求以及MySQL版本等因素综合考虑,选择最合适的实现方案。
26 6
|
8天前
|
SQL 关系型数据库 MySQL
MySQL技术安装配置、数据库与表的设计、数据操作解析
MySQL,作为最流行的关系型数据库管理系统之一,在WEB应用领域中占据着举足轻重的地位。本文将从MySQL的基本概念、安装配置、数据库与表的设计、数据操作解析,并通过具体的代码示例展示如何在实际项目中应用MySQL。
35 0
|
1月前
|
SQL 存储 关系型数据库
mysql加索引真的会锁表吗?揭秘背后的技术细节与规避策略
【8月更文挑战第16天】在数据库管理中,添加索引能大幅提升查询效率。MySQL执行此操作时的锁定行为常引起关注。文章详细解析MySQL中索引添加时的锁定机制及其原理。不同存储引擎及SQL语句影响锁定策略:MyISAM需全表锁定;InnoDB提供更灵活选项,如使用`ALTER TABLE... LOCK=NONE`可在加索引时允许读写访问,尽管可能延长索引构建时间。自MySQL 5.6起,在线DDL技术可进一步减少锁定时间,通过`ALGORITHM=INPLACE`和`LOCK=NONE`实现近乎无锁的表结构变更。合理配置这些选项有助于最小化对业务的影响并保持数据库高效运行。
114 4
|
1月前
|
存储 算法 关系型数据库
探索MySQL递归查询,优雅的给树结构分页!
总结起来,对于MySQL中的树结构数据,递归查询结合预排序遍历树算法可以实现优雅的分页,但需要注意性能优化和数据更新的问题。这项技术提供了一种高效处理层级数据的工具,使得开发者可以在复杂的数据结构下实现直观和可靠的数据查询。
61 1
|
1月前
|
SQL 关系型数据库 MySQL
MySQL】-DQL(基本、条件、分组、排序、分页)详细版
通过这些查询方法,你可以高效地检索、分析和组织MySQL数据库中的数据,以满足各种应用需求。实践中,理解这些SQL语句的基础知识以及它们如何组合起来进行复杂的数据操作是至关重要的。
26 1
|
1月前
|
前端开发 数据挖掘 关系型数据库
基于Python的哔哩哔哩数据分析系统设计实现过程,技术使用flask、MySQL、echarts,前端使用Layui
本文介绍了一个基于Python的哔哩哔哩数据分析系统,该系统使用Flask框架、MySQL数据库、echarts数据可视化技术和Layui前端框架,旨在提取和分析哔哩哔哩用户行为数据,为平台运营和内容生产提供科学依据。
|
3月前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.3-InnoDB中的锁
【MySQL技术内幕】6.3-InnoDB中的锁
182 57

热门文章

最新文章