一、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文件则是数据文件和索引文件的合并。