小言_互联网的博客

MYSQL---索引---物理结构

1353人阅读  评论(0)

本文意图理解以下几个问题。

一、思考

问题一:索引存放在哪里?

问题二: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的也为根页。在查找某个指定键值数据时,其步骤为下:

  1. 通过pageNum=3查找到根页。
  2. 在根页中通过二分查找法查找键值键值所在页的指针。
  3. 通过指针查到键值所在页。页内继续通过二分查找,如果到叶子节点,则查询结束,否则递归第二步,第三步。

本文简单介绍了InnoDB数据和索引的物理存储,如有不对之处,还请指出。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

参考博文:

https://www.cnblogs.com/leefreeman/p/8315844.html


转载:https://blog.csdn.net/qq_31331965/article/details/101906789
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场