mysql普遍使用B+树做索引, 但在不同的存储引擎中对索引的实现方式不同
InnoDB是聚簇索引
MyISAM是非聚簇索引
以一本字典为例 如果想要翻到100页, 则如果翻到了50页就继续向后翻, 如果翻到了120页就往回翻, 翻到100页即可获得第100页的内容, 这种即为聚簇索引, 即B+树的叶子节点直接存储着数据.
如果想要得到index这个词, 则需要翻开前面的目录, 根据按字母排序的表找到i, 再找到index, 然后再根据页码翻到index的所在页, 这种为非聚簇索引, 即B+树的叶子节点存放的是数据的地址.
InnoDB聚簇索引
-
主键索引
一个B+树保存了索引和具体的数据, key为主键, 叶子存储data数据行, 因此索引文件即为数据文件.
聚簇索引的数据的物理存放顺序与索引顺序是一致的, 所以在InnoDB引擎下必须要有主键, 最好设置ID为自增的, 让数据的物理地址连续, 使聚簇索引范围查询效率较高,这样也可以减少磁盘碎片, 提高存储效率. -
辅助索引
InnoDB的辅助索引叶子节点data存储的是主键key值, 因为数据是按照主键来存储的, 所以使用辅助索引查找时首先根据辅助索引找到主键key值, 之后再根据key值去主键索引查询获得data.
MyISAM非聚簇索引
与聚簇索引不同的是叶子结点data存储的是数据的地址. 通过索引先查询到数据的地址, 再通过地址获取数据,
所以索引文件和数据文件是分开的,索引的逻辑顺序和物理地址顺序没有必然联系
所以在查询时会多一次IO操作, 查询性能上会差一些
因为叶子节点存储的是数据的地址, 所以辅助索引和主索引没有太大区别.