@@ -3842,16 +3842,16 @@ MyISAM 的索引方式也叫做非聚集的,之所以这么称呼是为了与
38423842
38433843#### 原理
38443844
3845- 索引是在MySQL的存储引擎中实现的 ,不同的存储引擎的所支持的索引不一定完全相同
3845+ 索引是在 MySQL 的存储引擎中实现的 ,不同的存储引擎的所支持的索引不一定完全相同
38463846
3847- BTree的索引类型是基于B+Tree树型数据结构的 ,B+Tree又是BTree数据结构的变种 ,用在数据库和操作系统中的文件系统,特点是能够保持数据稳定有序
3847+ BTree 的索引类型是基于 B+Tree 树型数据结构的 ,B+Tree 又是 BTree 数据结构的变种 ,用在数据库和操作系统中的文件系统,特点是能够保持数据稳定有序
38483848
38493849磁盘存储:
38503850
38513851* 系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。
38523852
3853- - InnoDB存储引擎中有页 (Page)的概念,页是其磁盘管理的最小单位,InnoDB存储引擎中默认每个页的大小为16KB 。
3854- - InnoDB引擎将若干个地址连接磁盘块 ,以此来达到页的大小16KB,在查询数据时如果一个页中的每条数据都能有助于定位数据记录的位置,这将会减少磁盘I/O次数,提高查询效率。
3853+ - InnoDB 存储引擎中有页 (Page)的概念,页是其磁盘管理的最小单位,InnoDB 存储引擎中默认每个页的大小为 16KB 。
3854+ - InnoDB 引擎将若干个地址连接磁盘块 ,以此来达到页的大小16KB,在查询数据时如果一个页中的每条数据都能有助于定位数据记录的位置,这将会减少磁盘I/O次数,提高查询效率。
38553855
38563856
38573857
@@ -3861,15 +3861,15 @@ BTree的索引类型是基于B+Tree树型数据结构的,B+Tree又是BTree数
38613861
38623862#### BTree
38633863
3864- BTree又叫多路平衡搜索树,一颗m叉的BTree特性如下 :
3864+ BTree 又叫多路平衡搜索树,一颗 m 叉的 BTree 特性如下 :
38653865
38663866- 树中每个节点最多包含m个孩子
3867- - 除根节点与叶子节点外,每个节点至少有[ ceil(m/2)] 个孩子
3867+ - 除根节点与叶子节点外,每个节点至少有 [ ceil(m/2)] 个孩子
38683868- 若根节点不是叶子节点,则至少有两个孩子
38693869- 所有的叶子节点都在同一层
3870- - 每个非叶子节点由n个key与n+1个指针组成 ,其中 [ ceil(m/2)-1] <= n <= m-1
3870+ - 每个非叶子节点由 n 个key与 n+1 个指针组成 ,其中 [ ceil(m/2)-1] <= n <= m-1
38713871
3872- 5叉,key的数量 [ ceil(m/2)-1] <= n <= m-1 为 2 <= n <=4 ,当n>4时中间节点分裂到父节点 ,两边节点分裂
3872+ 5叉,key 的数量 [ ceil(m/2)-1] <= n <= m-1 为 2 <= n <=4 ,当 n>4 时中间节点分裂到父节点 ,两边节点分裂
38733873
38743874插入 C N G A H E K Q M F W L T Z D P R X Y S 数据的工作流程:
38753875
@@ -3905,12 +3905,12 @@ BTree又叫多路平衡搜索树,一颗m叉的BTree特性如下:
39053905
39063906 ![ ] ( https://gitee.com/seazean/images/raw/master/DB/MySQL-BTree工作流程8.png )
39073907
3908- BTREE树就已经构建完成了,BTREE树和二叉树相比 , 查询数据的效率更高, 因为对于相同的数据量来说,** BTREE的层级结构比二叉树小 ** ,所以搜索速度快
3908+ BTREE 树就已经构建完成了,BTREE 树和二叉树相比 , 查询数据的效率更高, 因为对于相同的数据量来说,** BTREE 的层级结构比二叉树小 ** ,所以搜索速度快
39093909
3910- BTree结构的数据可以让系统高效的找到数据所在的磁盘块 ,定义一条记录为一个二元组[ key, data] ,key为记录的键值 ,对应表中的主键值,data为一行记录中除主键外的数据 。对于不同的记录,key值互不相同,BTree中的每个节点根据实际情况可以包含大量的关键字信息和分支
3910+ BTree 结构的数据可以让系统高效的找到数据所在的磁盘块 ,定义一条记录为一个二元组 [ key, data] ,key 为记录的键值 ,对应表中的主键值,data 为一行记录中除主键外的数据 。对于不同的记录,key 值互不相同,BTree 中的每个节点根据实际情况可以包含大量的关键字信息和分支
39113911![ ] ( https://gitee.com/seazean/images/raw/master/DB/索引的原理-BTree.png )
39123912
3913- 当进行范围查找时会出现回旋查找
3913+ 缺点: 当进行范围查找时会出现回旋查找
39143914
39153915
39163916
@@ -3922,37 +3922,44 @@ BTree结构的数据可以让系统高效的找到数据所在的磁盘块,定
39223922
39233923##### 数据结构
39243924
3925- B+Tree为BTree的变种 ,B+Tree与BTree的区别为 :
3925+ B+Tree 为 BTree 的变种 ,B+Tree 与 BTree 的区别为 :
39263926
3927- * n叉B+Tree最多含有n个key (哈希值),而BTree最多含有n-1个key。
3927+ * n 叉 B+Tree 最多含有 n 个 key (哈希值),而 BTree 最多含有 n-1 个 key
39283928
3929- - 所有** 非叶子节点只存储键值key** 信息,可以看作key的索引部分
3930- - 所有** 数据都存储在叶子节点** ,按照key大小顺序排列
3929+ - 所有** 非叶子节点只存储键值 key** 信息,可以看作 key 的索引部分
3930+ - 所有** 数据都存储在叶子节点** ,按照 key 大小顺序排列
3931+ - 节点从上到下的所有节点中的 key 在叶子节点中也存在(比如 5),key 允许重复,B 树不同节点不存在重复的 key
39313932
39323933<img src =" https://gitee.com/seazean/images/raw/master/DB/MySQL-B+Tree数据结构.png " style =" zoom : 67% ;" />
39333934
3935+ B* 树:是 B+ 树的变体,在 B+ 树的非根和非叶子结点再增加指向兄弟的指针
3936+
3937+
3938+
3939+ ***
3940+
39343941
39353942
39363943##### 优化结构
39373944
3938- BTree数据结构中每个节点中不仅包含数据的key值,还有data值 。每一页的存储空间是有限的,如果data数据较大时将会导致每个节点 (即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数 ,进而影响查询效率
3945+ BTree 数据结构中每个节点中不仅包含数据的 key 值,还有 data 值 。每一页的存储空间是有限的,如果 data 数据较大时将会导致每个节点 (即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致 B-Tree 的深度较大,增大查询时的磁盘 I/O 次数 ,进而影响查询效率
39393946
3940- MySQL 索引数据结构对经典的B+Tree进行了优化,在原B+Tree的基础上 ,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B +Tree,** 提高区间访问的性能,防止回旋查找**
3947+ MySQL 索引数据结构对经典的 B+Tree 进行了优化,在原 B+Tree 的基础上 ,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的 B +Tree,** 提高区间访问的性能,防止回旋查找**
39413948
39423949区间访问的意思是访问索引为 5 - 15 的数据,这样就可以直接根据相邻节点的指针遍历
39433950
39443951![ ] ( https://gitee.com/seazean/images/raw/master/DB/索引的原理-B+Tree.png )
39453952
3946- 通常在B+Tree上有两个头指针 ,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。可以对B+Tree进行两种查找运算 :
3953+ 通常在 B+Tree 上有两个头指针 ,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。可以对 B+Tree 进行两种查找运算 :
39473954
39483955- 有范围:对于主键的范围查找和分页查找
3949- - 有顺序:从根节点开始,进行随机查找
3956+ - 有顺序:从根节点开始,进行随机查找,顺序查找
39503957
3951- InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT (4字节)或BIGINT (8字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB /(8B+8B)=1K个键值 (估值)。则一个深度为3的B+Tree索引可以维护 ` 10^3 * 10^3 * 10^3 = 10亿 ` 条记录
3958+ InnoDB 存储引擎中页的大小为 16KB,一般表的主键类型为 INT (4字节)或 BIGINT (8字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的 ** 一个节点 ** )中大概存储 16KB /(8B+8B)=1K 个键值 (估值)。则一个深度为3的B+Tree索引可以维护 ` 10^3 * 10^3 * 10^3 = 10亿 ` 条记录
39523959
3953- 实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree的高度一般都在2-4层。MySQL的InnoDB存储引擎在设计时是将根节点常驻内存的 ,也就是说查找某一键值的行记录时最多只需要1~ 3次磁盘 I/O 操作
3960+ 实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree的高度一般都在2-4层。MySQL 的 InnoDB 存储引擎在设计时是将根节点常驻内存的 ,也就是说查找某一键值的行记录时最多只需要1~ 3次磁盘 I/O 操作
39543961
3955- B+Tree优点 :提高查询速度,减少磁盘的IO次数 ,树形结构较小
3962+ B+Tree 优点 :提高查询速度,减少磁盘的 IO 次数 ,树形结构较小
39563963
39573964
39583965
@@ -7617,7 +7624,7 @@ Redis (REmote DIctionary Server) :用 C 语言开发的一个开源的高性
76177624
76187625
76197626
7620- ### 下载安装
7627+ ### 安装启动
76217628
76227629#### CentOS
76237630
0 commit comments