【MySQL高级篇笔记-索引的数据结构 (中) 】

此笔记为尚硅谷MySQL高级篇部分内容

目录

一、索引及其优缺点

1、索引概述

2、优点

3、缺点

二、InnoDB中索引的推演

1、设计索引

1.一个简单的索引设计方案

2.InnoDB中的索引方案

2、常见索引概念

1. 聚簇索引

2. 二级索引(辅助索引、非聚簇索引)

3. 联合索引

3、InnoDB的B+树索引的注意事项

1. 根页面位置万年不动

2. 内节点中目录项记录的唯一性

​编辑

​编辑

​编辑3. 一个页面最少存储2条记录

三、MyISAM中的索引方案 

MyISAM 与 InnoDB对比

小结

四、索引的代价

五、MySQL数据结构选择的合理性

全表遍历

Hash结构

二叉搜索树

AVL树

B-Tree

B+Tree

思考题 

R树

小结 

算法的时间复杂度


一、索引及其优缺点


1、索引概述

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。
这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法 

2、优点

(1)类似大学图书馆建书目索引,提高数据检索的效率,降低 数据库的IO成本 ,这也是创建索引最主要的原因。

(2)通过创建唯一索引,可以保证数据库表中每一行 数据的唯一性

(3)在实现数据的参考完整性方面,可以 加速表和表之间的连接 。换句话说,对于有依赖关系的子表和父表联合查询时,可以提高查询速度。

(4)在使用分组和排序子句进行数据查询时,可以显著 减少查询中分组和排序的时间 ,降低了CPU的消耗。

3、缺点

增加索引也有许多不利的方面,主要表现在如下几个方面:

(1)创建索引和维护索引要 耗费时间 ,并且随着数据量的增加,所耗费的时间也会增加。 (2)索引需要占 磁盘空间 ,除了数据表占数据空间之外,每一个索引还要占一定的物理空间, 存储在磁盘上 ,如果有大量的索引,索引文件就可能比数据文件更快达到最大文件尺寸。

(3)虽然索引大大提高了查询速度,同时却会 降低更新表的速度 。当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。因此,选择使用索引时,需要综合考虑索引的优点和缺点。

二、InnoDB中索引的推演


在没有索引的情况下,不论是根据主键列或者其他列的值进行查找,由于我们并不能快速的定位到记录所在的页,所以只能 从第一个页 沿着 双向链表 一直往下找,在每一个页中根据我们上面的查找方式去查找指定的记录。因为要遍历所有的数据页,所以这种方式显然是 超级耗时 的。如果一个表有一亿条记录呢?此时 索引 应运而生。

1、设计索引

【MySQL高级篇笔记-索引的数据结构 (中) 】_第1张图片

【MySQL高级篇笔记-索引的数据结构 (中) 】_第2张图片

【MySQL高级篇笔记-索引的数据结构 (中) 】_第3张图片

【MySQL高级篇笔记-索引的数据结构 (中) 】_第4张图片

1.一个简单的索引设计方案

【MySQL高级篇笔记-索引的数据结构 (中) 】_第5张图片

2.InnoDB中的索引方案

① 迭代1次:目录项纪录的页

【MySQL高级篇笔记-索引的数据结构 (中) 】_第6张图片

从图中可以看出来,我们新分配了一个编号为30的页来专门存储目录项记录。这里再次强调 目录项记录和普通的 用户记录 的不同点

【MySQL高级篇笔记-索引的数据结构 (中) 】_第7张图片

相同点: 

【MySQL高级篇笔记-索引的数据结构 (中) 】_第8张图片

② 迭代2次:多个目录项纪录的页

【MySQL高级篇笔记-索引的数据结构 (中) 】_第9张图片

【MySQL高级篇笔记-索引的数据结构 (中) 】_第10张图片

③ 迭代3次:目录项记录页的目录页

【MySQL高级篇笔记-索引的数据结构 (中) 】_第11张图片

【MySQL高级篇笔记-索引的数据结构 (中) 】_第12张图片

④ B+Tree

【MySQL高级篇笔记-索引的数据结构 (中) 】_第13张图片

2、常见索引概念

索引按照物理实现方式,索引可以分为 2 种:聚簇(聚集)和非聚簇(非聚集)索引。我们也把非聚集索引称为二级索引或者辅助索引。

1. 聚簇索引

【MySQL高级篇笔记-索引的数据结构 (中) 】_第14张图片

2. 二级索引(辅助索引、非聚簇索引)

【MySQL高级篇笔记-索引的数据结构 (中) 】_第15张图片

【MySQL高级篇笔记-索引的数据结构 (中) 】_第16张图片

3. 联合索引

【MySQL高级篇笔记-索引的数据结构 (中) 】_第17张图片

3、InnoDB的B+树索引的注意事项

1. 根页面位置万年不动

理解形成过程

【MySQL高级篇笔记-索引的数据结构 (中) 】_第18张图片

2. 内节点中目录项记录的唯一性

【MySQL高级篇笔记-索引的数据结构 (中) 】_第19张图片

【MySQL高级篇笔记-索引的数据结构 (中) 】_第20张图片

【MySQL高级篇笔记-索引的数据结构 (中) 】_第21张图片
3. 一个页面最少存储2条记录

【MySQL高级篇笔记-索引的数据结构 (中) 】_第22张图片

三、MyISAM中的索引方案 


【MySQL高级篇笔记-索引的数据结构 (中) 】_第23张图片

MyISAM索引的原理图

【MySQL高级篇笔记-索引的数据结构 (中) 】_第24张图片

【MySQL高级篇笔记-索引的数据结构 (中) 】_第25张图片

MyISAM 与 InnoDB对比

【MySQL高级篇笔记-索引的数据结构 (中) 】_第26张图片

【MySQL高级篇笔记-索引的数据结构 (中) 】_第27张图片

小结

【MySQL高级篇笔记-索引的数据结构 (中) 】_第28张图片

四、索引的代价


索引是个好东西,可不能乱建,它在空间和时间上都会有消耗:

  • 空间上的代价      
  • 时间上的代价【MySQL高级篇笔记-索引的数据结构 (中) 】_第29张图片

五、MySQL数据结构选择的合理性


全表遍历

Hash结构

【MySQL高级篇笔记-索引的数据结构 (中) 】_第30张图片 【MySQL高级篇笔记-索引的数据结构 (中) 】_第31张图片

Hash索引适用存储引擎如表所示:

【MySQL高级篇笔记-索引的数据结构 (中) 】_第32张图片

【MySQL高级篇笔记-索引的数据结构 (中) 】_第33张图片

二叉搜索树

如果我们利用二叉树作为索引结构,那么磁盘的IO次数和索引树的高度是相关的。

【MySQL高级篇笔记-索引的数据结构 (中) 】_第34张图片

AVL树

【MySQL高级篇笔记-索引的数据结构 (中) 】_第35张图片

B-Tree

【MySQL高级篇笔记-索引的数据结构 (中) 】_第36张图片

【MySQL高级篇笔记-索引的数据结构 (中) 】_第37张图片

B+Tree

【MySQL高级篇笔记-索引的数据结构 (中) 】_第38张图片

B+ 树和 B 树的差异:

1. 有 k 个孩子的节点就有 k 个关键字。也就是孩子数量 = 关键字数,而 B 树中,孩子数量 = 关键字数+1。

2. 非叶子节点的关键字也会同时存在在子节点中,并且是在子节点中所有关键字的最大(或最小)。
3. 非叶子节点仅用于索引,不保存数据记录,跟记录有关的信息都放在叶子节点中。而 B 树中,
非叶子节点既保存索引,也保存数据记录 。
4. 所有关键字都在叶子节点出现,叶子节点构成一个有序链表,而且叶子节点本身按照关键字的大小从小到大顺序链接。

思考题 

思考题:为了减少IO,索引树会一次性加载吗?


思考题:B+树的存储能力如何?为何说一般查找行记录,最多只需1~3次磁盘IO

【MySQL高级篇笔记-索引的数据结构 (中) 】_第39张图片
思考题:为什么说B+树比B-树更适合实际应用中操作系统的文件索引和数据库索引?

【MySQL高级篇笔记-索引的数据结构 (中) 】_第40张图片
思考题:Hash 索引与 B+ 树索引的区别

【MySQL高级篇笔记-索引的数据结构 (中) 】_第41张图片


思考题:Hash 索引与 B+ 树索引是在建索引的时候手动指定的吗? 

【MySQL高级篇笔记-索引的数据结构 (中) 】_第42张图片

R树

【MySQL高级篇笔记-索引的数据结构 (中) 】_第43张图片

小结 

【MySQL高级篇笔记-索引的数据结构 (中) 】_第44张图片

算法的时间复杂度


同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。

【MySQL高级篇笔记-索引的数据结构 (中) 】_第45张图片

高级篇笔记PDF自取

链接:https://pan.baidu.com/s/1pVqrTwIZFoED77i-EFmw6g?pwd=3333 
提取码:3333

你可能感兴趣的:(MySQL,笔记,mysql)