mysql中数据是存储在物理磁盘上的,而真正的数据处理又是在内存中执行的。由于磁盘的读写速度非常慢,如果每次操作都对磁盘进行频繁读写的话,那么性能一定非常差。为了上述问题,InnoDB将数据划分为若干页,以页作为磁盘与内存交互的基本单位,一般页的大小为16KB。这样的话,一次性至少读取1页数据到内存中或者将1页数据写入磁盘。通过减少内存与磁盘的交互次数,从而提升性能。
其实,这本质上就是一种典型的缓存设计思想,一般缓存的设计基本都是从时间维度或者空间维度进行考量的:
- 时间维度:如果一条数据正在在被使用,那么在接下来一段时间内大概率还会再被使用。可以认为热点数据缓存都属于这种思路的实现。
- 空间维度:如果一条数据正在在被使用,那么存储在它附近的数据大概率也会很快被使用。InnoDB的数据页和操作系统的页缓存则是这种思路的体现。
Page是整个InnoDB存储的最基本构件,也是InnoDB磁盘管理的最小单位,与数据库相关的所有内容都存储在这种Page结构里。
Page分为几种类型,常见的页类型有数据页(B+tree Node)Undo页(Undo Log Page)系统页(System Page) 事务数据页(Transaction System Page)等
Page 各部分说明
名称 | 占用大小 | 说明 |
---|---|---|
File Header | 38字节 | 文件头, 描述页信息 |
Page Header | 56字节 | 页头,页的状态 |
Infimum + Supremum | 26字节 | 最大和最小记录,这是两个虚拟的行记录 |
User Records | 不确定 | 用户记录,存储数据行记录 |
Free Space | 不确定 | 空闲空间,页中还没有被使用的空间 |
Page Directory | 不确定 | 页目录,存储用户记录的相对位置 |
File Trailer | 8字节 | 文件尾,校验页是否完整 |
-
File Header 字段用于记录 Page 的头信息,其中比较重要的是 FIL_PAGE_PREV 和 FIL_PAGE_NEXT 字段,通过这两个字段,我们可以找到该页的上一页和下一页,实际上所有页通过两个字段可以形成一条双向链表
-
Page Header 字段用于记录 Page 的状态信息。
-
Infimum 和 Supremum 是两个伪行记录,Infimum(下确界)记录比该页中任何主键值都要小的值,Supremum (上确界)记录比该页中任何主键值都要大的值,这个伪记录分别构成了页中记录的边界。
-
User Records 中存放的是实际的数据行记录
-
Free Space 中存放的是空闲空间,被删除的行记录会被记录成空闲空间
-
Page Directory 记录着与二叉查找相关的信息
-
File Trailer 存储用于检测数据完整性的校验和等数据。
页结构整体上可以分为三大部分,分别为通用部分(文件头、文件尾)、存储记录空间、索引部分。
1) 通用部分 (File Header&File Trailer )
通用部分 : 主要指文件头和文件尾,将页的内容进行封装,通过文件头和文件尾校验的CheckSum方式来确保页的传输是完整的。
其中比较重要的是在文件头中的 FIL_PAGE_PREV
和 FIL_PAGE_NEXT
字段,通过这两个字段,我们可以找到该页的上一页和下一页,实际上所有页通过两个字段可以形成一条双向链表
2) 记录部分(User Records&Free Space)
页的主要作用是存储记录,所以“最小和最大记录”和“用户记录”部分占了页结构的主要空间。另外空闲空间是个灵活的部分,当有新的记录插入时,会从空闲空间中进行分配用于存储新记录
3)数据目录部分 (Page Directory)
数据页中行记录按照主键值由小到大顺序串联成一个单链表(页中记录是以单向链表的形式进行存储的),且单链表的链表头为最小记录,链表尾为最大记录。并且为了更快速地定位到指定的行记录,通过 Page Directory
实现目录的功能,借助 Page Directory
使用二分法快速找到需要查找的行记录。
MySQL中page的作用及用法
在使用MySQL进行数据查询时,我们经常会需要分页查询来处理大量的数据。MySQL中的page功能可以帮助我们实现这个目的。本文将介绍MySQL中page的作用及用法。
page的作用
page的作用是将查询结果按照指定的大小分割成一个或多个页面。通过page,我们可以避免在查询大量数据时,一次性将所有结果返回给客户端,从而提高查询效率和响应时间。
page的用法
在MySQL中,我们可以使用LIMIT关键字来使用page功能。LIMIT后面的两个参数分别表示查询结果的偏移量和限制数量。
以下是一个简单的使用LIMIT实现分页查询的示例:
SELECT * FROM table LIMIT 0,10;
SELECT * FROM table LIMIT 10,10;
SELECT * FROM table LIMIT 20,10;
在上述示例中,第一条SQL语句查询表中第1到第10条数据,第二条SQL语句查询表中第11到第20条数据,第三条SQL语句查询表中第21到第30条数据。
除了使用LIMIT关键字,还可以使用OFFSET关键字来指定查询结果的偏移量。下面是一个使用OFFSET实现分页查询的示例:
SELECT * FROM table LIMIT 10 OFFSET 20;
该SQL语句查询表中第21到第30条数据。
需要注意的是,LIMIT语句的性能取决于查询语句中的条件和索引。当查询语句中有WHERE子句时,可以通过建立合适的索引来提高查询效率。同时,OFFSET的值不能太大,否则会导致性能下降。
另外,MySQL还支持使用两个关键字来实现复杂的分页查询,它们分别是TOP和ROWNUM。以下是使用TOP和ROWNUM来实现分页查询的示例:
SELECT TOP 10 * FROM table WHERE ROWNUM >= 20;
SELECT * FROM (SELECT * FROM table WHERE ROWNUM = 20;
第一条SQL语句查询表中第20到第29条数据,第二条SQL语句查询表中第20到第30条数据。
总结
MySQL中的page功能可以帮助我们实现分页查询,从而提高查询效率和响应时间。通过LIMIT和OFFSET等关键字,我们可以轻松地实现分页查询。在使用page功能时,需要注意查询语句中的条件和索引,以及OFFSET的值不能过大。
知识来源:马士兵教育
MySQL原理篇-page页 - 知乎
MySQL中page的作用及用法(MySQL中page)-数据库运维技术服务