5.1索引简介
5.1.1innoDB存储引擎支持以下几种常见的索引:
1.B+树索引-1.聚集索引 2.辅助索引 3.联合索引 4.覆盖索引
2.全文索引-倒排索引
3.哈希索引-哈希索引是自适应的,innoDB存储引擎会根据情况自动为决定是否为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引
5.2 数据结构与算法
5.2.1二分查找法
5.2.2二叉查找树和平衡二叉树
5.3 B+树
B+树的精简定义:B+树是为磁盘或其他直接存取辅助设备设计的一种平衡查找书。在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行连接。
5.3.1 B+树的插入操作
Leaf Page 满 | Index Page 满 | 操作 |
No | No | 直接将记录插入到叶子节点中 |
Yes | No | 1) 拆分Leaf Page 2) 将中间的节点放入到Index Page 中 3)小于中间节点的记录放左边 4)大于或等于中间节点的记录放右边 |
Yes | Yes | 1)拆分Leaf Page 2)小于中间节点的记录放左边 3)大于或等于中间节点的记录放右边 4)拆分Index Page 5)小于中间节点的记录放左边 6)大于中间节点的记录放右边 7)中间节点放入上一层Index Page |
5.4 B+树索引
数据库中的B+树索引可以分为聚集索引和辅助索引。
聚簇索引:数据是存放在叶子节点上。
辅助索引:叶子节点上是不存放真实数据的,而是存放聚集索引的索引值。
ps:什么是填充因子?
填充因子的作用:B+树使用填充因子来控制页面的分裂和合并,设置数据占用页面空间的百分比,目的是为后面的数据预留一部分页空间,当有新数据时,可以放到预留的页空间中,避免分页的发生
填充因子:默认的填充因子是50%,对于一棵m阶的B+树,填充因子是 m/2
5.4.1 聚集索引
1.什么是聚集索引?
聚集索引就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页(这些数据页即叶子节点通过双向链表链接)。
如图,可以看到,在叶子节点上存放的是数据的行记录格式,而在非叶子节点上,存放的是键值和数据的指向数据页的偏移量,而不是数据。
2.聚集索引的存储方式?
聚集索引的存储是逻辑上连续的。1.数据页通过双向链表链接,页按照主键的顺序排序
2.每个页中的记录也是通过双向链表进行维护的,物理存储上可以同样不按照主键存储。
3.聚集索引的好处?
聚集索引对于主键的排序查找和范围查找速度非常快,叶子节点的数据就是用户所要查询的数据。(因为B+树对于范围查找来说很快)
5.4.2 辅助索引
辅助索引的叶子节点除了包含键值以外,还包含聚集索引的索引值
图中为辅助索引和聚集索引的关系:
5.5 Cardinality值
5.6 B+树索引的使用
5.6.1
5.7 哈希
1.哈希表
碰撞问题:数据库中采用链接法解决散列函数的碰撞问题。
哈希函数:采用除法散列方式,即h(k)= k mod m,m的取值为略大于2倍的缓冲池页数量的质数。
自适应哈希索引对字典类型的查找非常快速(select * from table where index_col='xxx'),但是对于范围查找就无能为力。