介绍
B+树索引使用存储引擎如表所示:
索引/存储引擎 | MyISAM | InnoDB | Memory |
---|---|---|---|
B+树索引 | 支持 | 支持 | 支持 |
多个存储引擎支持同一种类型的索引,但是他们的实现原理是不同的。
InnoDB和MyISAM默认的索引是B+树索引,而Memory默认的索引是Hash索引。
MyISAM引擎使用B+树作为索引结构,叶子节点的data域存放的是数据记录的地址。
原理
MyISAM是没有聚簇索引的,所有的索引都理解为二级索引。
数据和索引是分离的。
MyISAM的索引方案也使用了树形结构,却是将索引和数据分开存储的。
- 将表中的记录按照记录的插入顺序单独存储在一个文件中,叫数据文件。
- 使用MyISAM存储引擎的表会将索引信息存储到另一个文件中,叫索引文件。MyISAM会单独为表的主键创建一个索引,但是在索引的叶子节点中存储的不是完整的用户记录,而是主键值+数据记录地址。
上图中,表一共有3列,假设以Col1位主键,可以看出MyISAM的索引文件仅仅保存数据记录的地址。
在MyISAM中,主键索引和二级索引在结构上没有区别,只是主键索引要求key是唯一的,而二级索引的key可以重复。如果在Col2上建立一个二级索引,则此索引的结构如下:
在MyISAM中索引检索的算法为:
- 按照B+树搜索算法搜索索引,如果指定的key存在,则取出其data域的值
- 以data域的值为地址,在数据文件中读取相应的数据记录。
MyISAM和InnoDB的对比
MyISAM的索引方式是非聚簇的,和InnoDB中包含1个聚簇索引是不同的。
1、在InnoDB中,只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录,而在MyISAM中需要进行一次回表操作,表示MyISAM中建立的索引都是二级索引。
2、InnoDB的数据文件就是索引文件,而MyISAM索引文件和数据文件是分离的。
3、InnoDB的非聚簇索引data域存储相应记录主键的值,而MyISAM索引记录的是地址。
4、MyISAM的回表操作是十分快速的,主要是拿地址偏移量直接到文件中取数据。
5、InnoDB要求表必须有主键,而MyISAM可以没有。
小结
了解不同存储引擎的索引实现方式对于正确使用和优化索引非常有帮助。