第七章 数据库索引



前言

索引相当于是个目录 , 加快查询数据
代价 : 消耗额外存储空间 , 引入索引可能会拖慢增删改的速度
但通常认为利大于弊


一、B树与B+树

适合索引的数据结构 : B+树 , 索引专属数据结构

B树(N叉搜索树) , 有地方会写作B-树 , 中间是连字符 , 不是减号 , 还是叫B树

B树有N个数 , 会划分出N+1个空间 , 默认不会有比最后一个数字更大的了~

在这里插入图片描述


B+树有N个数 , 会划分出N个空间 , 同样默认不会有比最后一个数更大的数字了~
并且会通过“双向链表”把叶子节点串起来

在这里插入图片描述


特点:

  1. B+树也是一个N叉搜索树
  2. 每个节点上有N个值,划分出N个区间(不是N+1个),期中最后一个元素表示当前子树的最大值(也可以约定第一个元素是最小值)
  3. 每个子节点中,也可以包含N个值,同时会把父节点中对应最大值,放过来==>最终效果,叶子节点,就是完整的数据集合~
  4. 叶子节点通过双向链表连接起来
  5. N叉树 , 高度更低(和红黑树比较)

B+树相比于B树的优势:

  1. 叶子节点是数据全集,并且用链表连接,非常方便,可进行范围查询
  2. 所有的数据都是在叶子上,使得叶子节点可以存储完整的数据行,非叶子节点,只需要存储索引key值即可~ 此时意味着非叶子节点占用空间较小,更适合在内存中缓存
  3. 每次查询,都是需要查询到叶子才能够完成查询的 , 中间经历的过程是差不多开销(比较次数是相当的)==>查询的开销比较稳定~~

虽然B树有时候会快一点 , 但我们更重视稳定性 !


二、页

页就是B+树上面的节点 , 分为 :

数据页 : 叶子节点,存储若干个数据行
索引页 :非叶子节点,只需要存储key /子节点的位置

数据库每次从硬盘上读取的时候,以页为单位进行读取的~~
页这样的结构(一个页中保存多组数据)贴合局部性原理

局部性原理 : 某个程序使用了某个位置的数据,大概率程序接下来还会继续使用这个位置附近位置的其他数据


三、索引分类

1.主键索引

• 当在⼀个表上定义一个主键 primary key时,InnoDB使用它作为聚集索引。
• 推荐为每个表定义一个主键。如逻辑上没有唯一且非空的列或列集可以使用主键,则添加 一个自增列。

2.普通索引

• 最基本的索引类型,没有唯一性的限制。
• 可能为多列创建组合索引,称为复合索引或组全索引

3.唯一索引

• 当在一个表上定义一个唯一键 unique 时,自动创建唯一索引。
• 与普通索引类似,但区别在于唯一索引的列不允许有重复值。

4.全文索引

• 基于文本列(char、varchar 或 text列)上创建,以加快对这些列中包含的数据查询和DML操作
• 用于全文搜索,仅MyISAM和InnoDB引擎支持。

5.聚集索引

• 与主键索引是同义词
• 如果没有为表定义 primary key, InnoDB使用第一个 unique 和 not null 的列作为聚集索引
• 如果表中没有 primary key 或合适的 unique 索引,InnoDB会为新插入的行生成一个行号并用6字节的 ROW_ID 字段记录, ROW_ID 单调递增,并使用 ROW_ID 做为索引。(ROW_ID是数据库控制 , 我们无法干预)

6.非聚集索引

• 聚集索引以外的索引称为非聚集索引或二级索引
• 二级索引中的每条记录都包含该行的主键列,以及二级索引指定的列。
• InnoDB使用这个主键值来搜索聚集索引中的行,这个过程称为回表查询

问 : 非聚簇索引非叶子节点存放什么 ?
答 : 叶子节点存储索引列的值 + 主键id , 因此查询到的时候不是直接查到对应的数据行 , 而是对应的主键id , 然后再去主键索引中找到对应的数据行 , 这一过程叫回表

7.索引覆盖

• 当⼀个select语句使用了普通索引且查询列表中的列刚好是创建普通索引时的所有或部分列,这时就可以直接返回数据,而不用回表查询,这样的现象称为索引覆盖

举例 : 要查询id 和name , 二级索存 name + 主键索引 id , where条件用了name , 则不需要回表了


四、创建普通索引

针对空表/小表创建索引,都没啥问题.
但如果是一个大表(表里已经有千万级别的数据了),再去创建索引,这就成了危险操作!!!

create index 索引名 on 表名(列名) ;

在这里插入图片描述

注意 :

select * from class where id=14 or id=15;

像上述语句 , 查询时查询条件中使用索引列作为条件索引才会生效

select * from class where classid=6 ;

而这样仍以遍历全表的方式进行查询


五、查看索引

show index from 表名;

在这里插入图片描述


六、删除索引

删除主键索引

alter table 表名 drop primary key ;

在这里插入图片描述


删除其他索引

alter table 表名 drop index 索引名 ;

在这里插入图片描述

七、提问

计算三层树⾼的B+树可以存放多少条记录?


总结

此处省略八百字~~~

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐