MySQL 页(Page)
MySQL在数据库中用得最广泛,所以大家研究得也最多,真是越来越深入了。
以下主要说的是MySQL中InnoDB的存储结构,主要讨论页、查询方式。直接上图。
表空间(table space)
在 InnoDB 中存在两种表空间的类型:共享表空间和独立表空间。
共享表空间:多张表共用一个表空间
独立表空间:每张表有一个独立的表空间,数据和索引信息都会保存在自己的表空间中。
mysql > show variables like 'innodb_file_per_table';
InnoDB把数据保存在表空间内,表空间可以看作是InnoDB存储引擎逻辑结构的最高层,是一个或多个磁盘文件组成的虚拟文件系统。
InnoDB用表空间存储内容:表数据、索引、回滚段、双写缓冲区。
数据库由一个或多个表空间组成,表空间从管理上可以划分:系统表空间、用户表空间、撤销表空间、临时表空间。
段(segment)
由一个或多个区组成,区在文件系统是一个连续分配的空间(在 InnoDB 中是连续的 64 个页)
当我们创建数据表、索引的时候,就会相应创建对应的段。比如创建一张表则创建一个表段,创建一个索引则会创建一个索引段。
区(extent)
为了保证页的连续性,InnoDB存储引擎每次从磁盘一次申请4-5个区。默认情况下,InnoDB存储引擎的页大小为16KB,即一个区中有64个连续的页。
行(row)
InnoDB存储引擎是按行进行存放的。
页(Page)
页是InnoDB存储引擎磁盘管理的最小单位,每个页默认16KB,每个页包含一组连续的数据行或索引项,以提高访问数据的效率。
页的底层实现方式与存储引擎有关。不同的存储引擎可能会使用不同的数据结构来组织和管理页。
InnoDB 存储引擎使用了 B+ 树来组织和管理索引页和数据页,以提高访问效率。
MyISAM 存储引擎使用了堆数据结构来管理数据页,以提高插入和删除数据的性能。
InnoDB存储引擎中,常见的页类型有:
数据页(B-tree Node)
undo页(undo Log Page)
系统页 (System Page)
事物数据页 (Transaction System Page)
插入缓冲位图页(Insert Buffer Bitmap)
插入缓冲空闲列表页(Insert Buffer Free List)
未压缩的二进制大对象页(Uncompressed BLOB Page)
压缩的二进制大对象页 (compressed BLOB Page)
下图是页的存储结构和大小。
第一通用部分:主要指文件头和文件尾,将页的内容进行封装
第二数据记录部分:页的主要作用是存储记录,一个页内必须存储2行记录,否则就不是B+tree,而是链表,记录之间是单向链表。
在页中,记录是以单向链表的形式进行存储的。单向链表的特点就是插入、删除非常方便,但是检索效率不高,最差的情况下需要遍历链表上的所有节点才能完成检索。
第三索引部分:这部分是页目录(示意图2中的s0-sn,绿色未分配空间的下面),它起到了记录的索引作用。
因为记录部分是单向链表,所以为了支持索引快速查询,做法:在页目录中提供了二分查找的方式,用来提高记录的检索效率,即给记录创建了一个目录。将所有的记录分成几个组,这些记录包括最小记录和最大记录,但不包括标记为已删除的记录。
页目录用来存储每组最后一条记录的地址偏移量,这些地址偏移量会按照先后顺序存储起来,每组的地址偏移量也被称之为槽(slot),每个槽相当于指针指向了不同组的最后一个记录。
B+ 树是如何进行记录检索
从 B+ 树的根开始,逐层检索,直到找到叶子节点,找到对应的数据页为止,将数据页加载到内存中,页目录中的槽(slot)采用二分查找的方式先找到一个粗略的记录分组,然后再在分组中通过链表遍历的方式查找记录。
页目录存储的是槽,槽相当于分组记录的索引。我们通过槽查找记录,实际上就是在做二分查找。
页的作用
1、页的作用是将数据和索引组织成连续的块。这有助于优化数据库的性能,因为MySQL可以直接从硬盘读取整个页,而不是逐个读取每个数据行或索引项。
2、减少磁盘碎片:由于数据和索引被组织成连续的块,MySQL可以更好地管理磁盘碎片,减少磁盘寻道时间。
3、缓存:MySQL使用缓存(cache)将常用页面存储在内存中,以提高访问速度。
页缓存(Page Cache)
当 MySQL 需要读取或写入表数据时,它会先将数据读取或写入到页缓存(Page Cache)中。页缓存是 MySQL 中的一种内存缓存,用于缓存最近使用的页。当需要访问某个页时,MySQL 会首先在页缓存中查找该页是否已经被缓存,如果已经被缓存,那么直接从页缓存中读取数据。否则,MySQL 就需要从磁盘上的数据文件中读取该页,并将其存储到页缓存中,以便下次更快地访问。
唠嗑广场
最近,淘宝的美妆大主播在直播时出现技术性错误,面对消费者时指责消费者不努力才觉得眉笔贵。这件事在各大平台、各类大V的分析文章已经不少了。
我只是普通人,搞IT技术的,对于这种新闻或者这一类新闻,比如说各种明星的花边新闻,我的态度和处理逻辑都是一样的:选择忽视,不作关注。
一个人的精力是极其有限的,特别是成为中年人之后,需要关注的领域有:健康、父母、孩子、投资、工作成长等等,这些与自己息息相关的事情非常多,实在是不应该投入时间和情绪到外界与自己无关的事情上来,
但我感觉,就是因为我们这一类人的性格和习惯【不说、不理会】,导致网络上没有我们的声音,所以有时候我们还是要表达自己的态度,对于事情的态度,不仅仅只有赞同、反对,还有一种叫做【不知道、不关心】。
只有在生活中持续做减法,降低不重要的事情的声音,才能让与自己有关的重要事情清晰可见。