按索引是否包含记录数据索引可分为:
- 聚簇索引,将数据存储与索引放到了一块,找到索引也就找到了数据,不需要根据主键或行号去进行回表查询。
- 非聚簇索引,非聚簇索引就是指B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。主索引和辅助索引没啥区别,只是主索引中的key一定得是唯一的。主要用在MyISAM存储引擎中.MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。
按索引是否建立在主键上分类
- 主键索引,在MySQL的主键上创建的索引就是主键索引,主键索引会自动创建,一个表只能有一个主键索引,同时主键索引也是唯一索引。
- 辅助索引,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,innodb中辅助索引叶子节点存储的不再是行的物理位置,而是键值和主键 ID。
按索引是底层的数据结构分类
- HASH索引
- 等值查询较快,但是不稳定
- 不能使用范围查询
- 不能避免数据排序
- 不能利用组合索引的部分字段进行查询
- 不支持模糊查询
- 避免不了回表查询
- B+Tree索引
- 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
- 内节点不存储data,只存储key;叶子节点不存储指针。
- 不可能在非叶子结点命中;
- 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
- B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了提高区间访问的性能
按索引的常规功能分类
- 唯一索引 (UNIQUE Indexs),要求索引列的所有值都只能出现一次,即必须唯一。
- 普通索引 (Normal index),仅用来提高查询速度,没有其他特性。
- 全文索引 (FULLTEXT Indexes),MySQL可以通过建立全文索引,利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度。比如实现全匹配模糊查询。但是实际场景测试mysql的全文索引性能非常不稳定,不建议生产环境使用。需要使用全文检索的地方,还是推荐使用Elasticsearch
- 空间索引 (Spatial indexes)空间索引使用R树,R树是用于索引多维数据的专用数据结构。
其他特性索引
- 覆盖索引,如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。