索引
分类
1.按物理存储
-
聚簇索引(主键索引)
所有完整的用户记录都放在主键索引的B+树的叶子节点里 -
二级索引(辅助索引)
不是主键的索引.
补充
若在查询时使用了二级索引,在二级索引中查询的到想要的数据,不用回表,这个过程就是索引覆盖
如果查询的数据不在二级索引里,就会先检索二级索引,找到对应叶子结点,获取到主键值后,然后在检索主键索引,就可以查询到数据了,这个过程就是回表
2.按字段特性
- 主键索引
建立在主键上的索引被称为主键索引,一张数据表只能有一个主键索引,索引列值不允许有空值,通常在创建表时一起创建 - 唯一索引
建立在UNIQUE字段上的索引被称为唯一索引,一张表可以有多个唯一索引,索引列值允许为空,列值中出现多个空值不会发生重复冲突 - 普通索引
建立在普通字段上的索引被称为普通索引 - 前缀索引
对字符类型字段的前几个字符或对二进制类型字段的前几个bytes建立的索引,而不是在整个字段上建索引
3.按字段个数
- 单列索引
单个列组成一个索引 - 联合索引
多个列组成一个索引
查询
InnoDB里索引是按照B+树的方式来存储,其中,按主键大小对用户记录和数据页进行排序,记录用单向链表,数据页用双向链表.
举栗子
如下图,叶子节点保存了完整的用户记录,非叶子结点是目录项记录,而根节点是目录项记录的目录
问题
B+树如何快速查找主键为6的记录?
过程如下
1.从根节点开始,通过二分法快速定位到符合页内包含查询值的页,因为查询的值为6,在[1,7)范围之间,所以到页30查找更详细的目录项
2.在非叶子节点(页30)中,继续通过二分法快速定位到符合页内范围包含查询值的页,主键值大于5,所以就到叶子节点(页16)查找记录
3.然后,在叶子节点(页16)中,通过槽查找记录时,用二分法快速定位到要查询的记录在哪个槽,再遍历槽内所有记录,找到主键为6的记录