MySQL数据库——索引(1)-概述以及B-Tree结构

目录

索引概述

介绍

优缺点

索引结构(1)

介绍

二叉树

B-Tree


索引这一个章节将分为以下几个部分来学习:

  • 索引概述
  • 索引结构
  • 索引分类
  • 索引语法
  • SQL性能分析
  • 索引使用
  • 索引设计原则

索引概述

介绍

索引(index)是帮助MySQL高效获取数据数据结构有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

在没有索引的情况下,对表数据进行查询时(例如查询年龄等于45),

需要对整个表进行扫描,一条一条地匹配是否符合查询的条件 ;

如果运用了二叉搜索树的结构去索引,查询时就不需要进行全表扫描,很快就能找到表中年龄等于45的信息。

优缺点

优势 劣势
提高数据检索的效率,降低数据库的IO成本 索引列也需要占用空间
通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗 索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE时,效率降低。

若频繁修改表中索引字段数据,索引的维护工作也会随之而频繁,甚至数据的不一致性问题出现

索引结构(1)

介绍

前面我们在学习存储引擎的时候了解到,MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种(有一些数据结构基础的更好理解):

索引结构 描述
B+Tree索引
最常见的索引类型,大部分引擎都支持 B+ 树索引
Hash 索引
底层数据结构是用哈希表实现的 , 只有精确匹配索引列的查询才有效 ,
支持范围查询
R-tree( 空间索
引)
空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类
型,通常使用较少
Full-text( 全文
索引 )
是一种通过建立倒排索引 , 快速匹配文档的方式。类似于
Lucene,Solr,ES

B+树是使用得最多的,我们重点研究B+树,

接下来,我们再来看看不同的存储引擎对于索引结构的支持情况:

索引 InnoDB MyISAM Memory
B+tree 索引
支持
支持
支持
Hash 索引
不支持
不支持
支持
R-tree 索引
不支持
支持
不支持
Full-text
5.6 版本之后支持
支持 不支持
注意:我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。

二叉树

假如说MySQL的索引结构采用二叉树的数据结构,比较理想的结构如下:

如果主键是顺序插入的,则会形成一个单向链表,结构如下:

所以,如果选择二叉树作为索引结构,会存在以下缺点:

  • 顺序插入时,会形成一个链表,查询性能大大降低。
  • 大数据量情况下,层级较深,检索速度慢。

此时可能会想到,可以选择红黑树,红黑树是一颗自平衡二叉树,那这样即使是顺序插入数据,最终形成的数据结构也是一颗平衡的二叉树,结构如下:

但是,即使如此,由于红黑树也是一颗二叉树,所以也会存在一个缺点:

  • 大数据量情况下,层级较深,检索速度慢。

所以,在MySQL的索引结构中,并没有选择二叉树或者红黑树,而选择的是B+Tree。

在学习B+Tree之前,先来介绍一个B-Tree。

B-Tree

B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。
以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key,5个指针。

注:树的度数指的是一个节点的子节点个数。

我们可以通过一个数据结构可视化的网站来简单演示一下。

https://www.cs.usfca.edu/~galles/visualization/BTree.html


插入一组数据: 100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88
120 268 250 。然后观察一些数据插入过程中,节点的变化情况。

特点:

  • 5阶的B树,每一个节点最多存储4个key,对应5个指针。
  • 一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂。
  • 在B树中,非叶子节点和叶子节点都会存放数据。


END


学习自:黑马程序员——MySQL数据库课程

猜你喜欢

转载自blog.csdn.net/li13437542099/article/details/132817264