本文意图理解以下几个问题。
一、思考
问题一:索引存放在哪里?
问题二:B+树是如何以文件形式存储,如何读取?
二、分析
-
索引文件位置
索引可以理解为一种数据结构,我们按照这种数据结构能快速定位到数据。大家会很容易想到这种类似字典的概念性东西,但是大家有没有思考过索引自身也是数据,其存放在哪里。如何将这种数据结构存放?多个索引如何存放?如何将存放的数据又转换为内存中的数据结构以便查找?即一个索引文件到底是怎样的?
首先我们看下MYSQL数据存放目录(my.ini配置文件可配置):
该目录下文件:
xzgooo:数据库名,每一个数据库一个独立文件夹。
ibdata1:采用共享表空间方式时(所有数据和索引存储在一个或者多个文件中),数据和索引的存放位置。
xx-slow.log:慢日志存放位置。
对于每一个数据库,例如上图xzgooo:
.frm:表结构定义文件。
.ibd:采用独立表空间方式时(每个表单独文件存放数据和索引),数据和索引的存放位置。
至此,我们了解到索引和数据的存放位置,那么假如采用独立表空间方式,是如何将B+树以文件形式存储?
-
存储数据最小单元
磁盘:磁盘存储数据最小单元为“扇区”,一个扇区大小为512字节。
文件系统:文件系统存储数据的最小单元为“块”,一个块的大小是4k。
InnoDB存储引擎:InnoDB存储引擎的最小单元为“页”,一个页的大小为16k。
所以InnoDB中所有数据文件(.ibd结尾)的文件大小都为16k(默认,可通过参数调整)的整数倍。
为了查找方便,将数据以B+树的结构组织,B+树的每一个节点为一个页。页可以用来存储数据,也可以用来存储键值和指针,在B+树结构中,非叶子节点存储键值和指针,叶子节点存放数据。一个页中中可存储多个键值和指针,或者多条数据。
-
数据存储和查找
表空间文件(.ibd)文件中每一页都有一个编号pageNum,约定pageNum为3的也为根页。在查找某个指定键值数据时,其步骤为下:
- 通过pageNum=3查找到根页。
- 在根页中通过二分查找法查找键值键值所在页的指针。
- 通过指针查到键值所在页。页内继续通过二分查找,如果到叶子节点,则查询结束,否则递归第二步,第三步。
本文简单介绍了InnoDB数据和索引的物理存储,如有不对之处,还请指出。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考博文:
https://www.cnblogs.com/leefreeman/p/8315844.html
转载:https://blog.csdn.net/qq_31331965/article/details/101906789