目录
各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
索引的实现是由存储引擎来实现的,那么在 MySQL 中比较主流的两大引擎是:MyIsam 和 InnoDB。可以在建表的时候指定使用哪种存储引擎,如你可以这样指定:
在MyIsam引擎中的体现
MyISAM 的数据和索引是分别存储的,在创建好表结构并且指定存储引擎为 MyISAM 之后,会在数据目录生成3个文件,分别是 table_name.frm(表结构文件),table_name.MYD(数据保存文件),table_name.MYI(索引保存文件)。这些在mysql体系结构、存储文件和sql语句的执行流程 也说过,关于B+Tree相关的在mysql索引机制、二分查找法、二叉树、平衡二叉树、B-Tree、B+Tree有详细介绍,感兴趣的可以看下。
如上一张表,两个文件分别保存了数据及索引,由于 B+Tree 中只有叶子节点保存数据区,在 MyISAM 中,B+Tree的数据区中保存的是数据的引用地址,比如说 id 为101的数据信息所保存到物理磁盘地址为 0x123456,当扫描到这个指针位置,就可以通过这个磁盘指针将数据加载出来。
在 MyISAM 中,name 索引和 ID 索引是一样的,叶子节点也是保存它指向的磁盘位置指针,他们是平级的。
在InnoDB 引擎中的体现
InnoDB 的数据和索引是存储在一起的,在创建好表结构并且指定存储引擎为 InnoDB 之后,会在数据目录生成2个文件,分别是 table_name.frm(表结构文件),table_name.idb(数据与索引保存文件)。InnoDB B+Tree 的体现是以主键为索引来组织数据的存储,当我们没有显示的建立主键索引的时候,存储引擎会隐式的生成一个6位的 int 型的索引来作为它的主键索引以组织数据的存储。
数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同,InnoDB 就是以聚集索引来组织数据的存储的,在叶子节点上,保存了数据的所有信息。如果这个时候建立了 name 字段的索引,它是如何组织数据的,如下图所示:
会产生一个辅助索引,即 name 字段的索引,而此刻叶子节点上所保存的数据为聚集索引(ID索引)的关键字的值,基于辅助索引找到 ID 索引的值,再通过 ID 索引区获取最终的数据。这个做法的好处是在于产生数据迁移的时候只要 ID 没发生变法,那么辅助索引不需要重新生成,不这么做的话,如果存储的是磁盘地址的话,在数据迁移后所有辅助索引都需要重新生成。
MyIsam与InnoDB引擎的主要区别
InnoDB:行级锁、支持事务、主键索引方式进行数据存储、支持外键关系保证数据完整性。
MyISAM:表锁、不支持事务、数据和索引分开存储。