大厂面试必备(二)——数据库存储引擎

一、MYISAM存储引擎索引实现

      存储引擎形容的是数据库还是形容表的?答案是表。
      在mysql中,数据库的数据最终是存储在我们电脑指定的磁盘位置上,找到mysql对应的data文件夹。如果某张表的索引是MyISAM,通过查看磁盘data文件夹里面的文件我们可以看到,这张表有对应的三个文件:表名.frm、表名.MYD、表名.MYI。
      表名.frm存储的是表结构相关的信息,也就是这张表大概是怎么构成的;表名.MYD,其中MY是MyISAM的缩写,D是代表data,所以这个文件存储的是这张表里面的数据行的记录。表名.MYI,其中I代表Index,所以这个文件里面存放的是这张表的索引字段。
在这里插入图片描述

  • MylSAM索引文件和数据文件是分离的(非聚集)
  • 从这张图,我们可以看出Col1设置了MylSAM索引。比如但我们去查找Col1的值为49的数据时,首先数据库会先判断Col1是否有索引,如果有,它就去表名.MYI文件里面进行查找;当查找到相关地址信息时,它会通过这个地址,去表名.MYD中查找对应的数据。

二、InnoDB存储引擎索引实现

      InnoDB索引实现(聚集)

  • 表数据文件本身就是按B+Tree组织的一个索引结构文件;
  • 聚集索引-叶节点包含了完整的数据记录;
  • 为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?
           Mysql在设计的时候,InnoDB的表必须必须用B+树来组织。如果我们没有设置主键或者索引,mysql会在后台为这张表生成一列唯一的数据,有点类似于我们说的rowid字段,它是一个整型字段(1,2,3,. . .),这一列数据我们看不到。推荐整型的话是因为整型数字大小的比较比字符串的比较要快,试想一下两个UUID作比较和两个数字作比较。
  • 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)
            在mysql数据库,如果某张表的索引是InnoDB,通过查看磁盘data文件夹里面的文件我们可以看到这张表对应的有两个文件:表名.frm和表名.ibd
           同样的,.frm文件存放的是表结构的文件,而.ibd文件则是数据文件和索引文件的合并。

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章