概念
索引是帮助MySQL高效的获取数据的排序好的数据结构,索引具有的特点:通过数据结构和算法来对原始数据进行有效的组织,通过有效的组织,可以引导使用者对原始数据进行快速检索。
索引类型
单列索引
一个索引只包含单个列,但一个表中可以有多个单列索引。
普通索引
MySQL中基本索引类型,没什么限制,允许在定义索引的列中插入重复值和空值,目的就是为了更快速查询数据。
唯一索引
索引列中的值必须是唯一的,但是允许为空值。
主键索引
是一种特殊的唯一索引,不允许为空值,主键约束就是一个主键索引。
组合索引
使用表中的多个字段组合上创建索引,使用组合索引时需遵循最左前缀匹配索引才会生效。
全文索引
全文索引只有在MyISAM存储引擎上才能使用,只能在char、varchar、text类型字段上使用全文索引。使用全文索引在存储的一堆文字数据中,通过其中的某个关键字就能找到该字段所属的记录行。
索引数据结构
B-Tree
B-Tree数据存储采用key-value的方式存储,key为bigint类型8个字节,每个节点有两个指针,每个指针为4个字节,所以一个节点占用的存储空间为16字节, 具有的特点:
叶子节点具有相同的深度,叶节点的指针为空
所有的索引元数不重复
节点中的数据索引从左到右递增排序
B-Tree不支持范围查询的快速查找,在范围查找查询到一个数据后,接下来的查询还需要回到根节点重新遍历。
B+Tree
B+Tree时B-Tree的变种,B+Tree的数据存储在叶子节点上。B+Tree具有的特点:
非叶子节点不存储数据,只存储索引(冗余),可以存放更多的索引
叶子节点包含所有索引字段
叶子节点用指针连接,提供区间访问的性能
B+Tree中检索数据时,每次检索都是从根节点开始,一致搜索到匹配的叶子节点
索引分类
聚集索引
聚集索引:InnoDB引擎实现,每个表右且一定会有一个聚集索引,整个表的数据存储在聚集索引的叶子节点上,非叶子节点存储记录的主键值,当表中为指定主键时,MySQL内部会自动给每条记录添加一个隐藏的rowid(默认4个字节)作为主键,使用rowid构建聚集索引。
非聚集索引
非聚集索引(辅助索引):MyISAM引擎实现,也是B+Tree结构,不过有一点和聚集索引不同,非聚集索引叶子节点存储字段(索引字段)的值及对应记录主键的值,其他节点只存储所以字段值。