没有合适的资源?快使用搜索试试~ 我知道了~
MySQL索引背后的数据结构及算法原理.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 158 浏览量
2022-06-27
03:14:40
上传
评论
收藏 851KB DOCX 举报
温馨提示
试读
26页
MySQL索引背后的数据结构及算法原理.docxMySQL索引背后的数据结构及算法原理.docxMySQL索引背后的数据结构及算法原理.docxMySQL索引背后的数据结构及算法原理.docxMySQL索引背后的数据结构及算法原理.docxMySQL索引背后的数据结构及算法原理.docxMySQL索引背后的数据结构及算法原理.docxMySQL索引背后的数据结构及算法原理.docx
资源推荐
资源详情
资源评论
MySQL 索引背后的数据结构及算法原理
摘要
本文以 MySQL 数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要
说明的是,MySQL 支持诸多存储引擎,而各 种存储引擎对索引的支持 也各不相
同,因此 MySQL 数据库支持多种索引类型,如 BTree 索引,哈希索引,全文索引
等等。为了避免混乱,本文将只关注于 BTree 索引,因为这是 平常使用 MySQL
时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。
文章主要内容分为三个部分。
第一部分主要从数据结构及算法理论层面讨论 MySQL 数据库索引的数理基础。
第二部分结合 MySQL 数据库中 MyISAM 和 InnoDB 数据存储引擎中索引的架构实现
讨论聚集索引、非聚集索引及覆盖索引等话题。
第三部分根据上面的理论基础,讨论 MySQL 中高性能使用索引的策略。
摘要
数据结构及算法基础
索引的本质
B-Tree 和 B+Tree
为什么使用 B-Tree(B+Tree)
MySQL 索引实现
MyISAM 索引实现
InnoDB 索引实现
索引使用策略及优化
示例数据库
最左前缀原理与相关优化
索引选择性与前缀索引
InnoDB 的主键选择与插入优化
后记
参考文献
数据结构及算法基础
索引的本质
MySQL 官方对索引的定义为:索引(Index)是帮助 MySQL 高效获取数据的数据
结构。提取句子主干,就可以得到索引的本质:索引是数据结构。
我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度
能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本
的查询算法当然是顺序查找(linear search),这种复杂度为 O(n)的算法在数
据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算
法,例如二分查找(binary search)、二叉树查找(binary tree search)等。
如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例
如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是
数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将
两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查
找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以
在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
看一个例子:
图 1
图 1 展示了一种可能的索引方式。左边是数据表,一共有两列七条记录,最左边
的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理
相邻的)。为了加快 Col2 的查找,可以维护一个右边所示的二叉查找树,每个
节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运
用 二叉查找在 O(log n)的复杂度内获取到相应数据。
2
虽然这是一个货真价实的索引,但是实际的数据库系统几乎没有使用二叉查找树
或其进化品种红黑树(red-black tree)实现的,原因会在下文介绍。
B-Tree 和 B+Tree
目前大部分数据库系统及文件系统都采用 B-Tree 或其变种 B+Tree 作为索引结
构,在本文的下一节会结合存储器原理及计算机存取原理讨论为什么 B-Tree 和
B+Tree 在被如此广泛用于索引,这一节先单纯从数据结构角度描述它们。
B-Tree
为了描述 B-Tree,首先定义一条数据记录为一个二元组[key, data],key 为记
录的键值,对于不同数据记录,key 是互不相同的;data 为数据记录除 key 外的
数据。那么 B-Tree 是满足下列条件的数据结构:
1. d 为大于 1 的一个正整数,称为 B-Tree 的度。
2. h 为一个正整数,称为 B-Tree 的高度。
3. 每个非叶子节点由 n-1 个 key 和 n 个指针组成,其中 d<=n<=2d。
4. 每个叶子节点最少包含一个 key 和两个指针,最多包含 2d-1 个 key 和 2d
个指针,叶节点的指针均为 null 。
5. 所有叶节点具有相同的深度,等于树高 h。
6. key 和指针互相间隔,节点两端是指针。
7. 一个节点中的 key 从左到右非递减排列。
8. 所有节点组成树结构。
9. 每个指针要么为 null,要么指向另外一个节点。
10.如果某个指针在节点 node 最左边且不为 null,则其指向节点的所有 key
小于 v(key ),其中 v(key )为 node 的第一个 key 的值。
1 1
11.如果某个指针在节点 node 最右边且不为 null,则其指向节点的所有 key
大于 v(key ),其中 v(key )为 node 的最后一个 key 的值。
m m
12.如果某个指针在节点 node 的左右相邻 key 分别是 key 和 key 且不为
i i+1
null,则其指向节点的所有 key 小于 v(key )且大于 v(key )。
i+1 i
图 2 是一个 d=2 的 B-Tree 示意图。
图 2
由于 B-Tree 的特性,在 B-Tree 中按 key 检索数据的算法非常直观:首先从根节
点进行二分查找,如果找到则返回对应节点的 data,否则对 相应区间的指针指
向的节点递归进行查找,直到找到节点或找到 null 指针,前者查找成功,后者
查找失败。B-Tree 上查找算法的伪代码如下:
1 BTree_Search(node, key)
2 {
3
if(node == null) return null;
4
5 foreach(node.key)
6 {
7 if(node.key[i] == key) return node.data[i];
8 if(node.key[i] > key) return BTree_Search(point[i]->node);
}9
10
11
12}
13
return BTree_Search(point[i+1]->node);
14data = BTree_Search(root, my_key);
关于 B-Tree 有一系列有趣的性质,例如一个度为 d 的 B-Tree,设其索引 N 个 key,
则其树高 h 的上限为 log ((N+1)/2),检索一个 key,其查找节点个数的渐进复
d
杂度为 O(log N)。从这点可以看出,B-Tree 是一个非常有效率的索引数据结构。
d
另外,由于插入删除新的数据记录会破坏 B-Tree 的性质,因此在插入删除时,
需要对树进行一个分裂、合并、转移等操作以保持 B-Tree 性质,本 文不打算完
整讨论 B-Tree 这些内容,因为已经有许多资料详细说明了 B-Tree 的数学性质及
插入删除算法,有兴趣的朋友可以在本文末的参考文献一栏找 到相应的资料进
行阅读。
B+Tree
B-Tree 有许多变种,其中最常见的是 B+Tree,例如 MySQL 就普遍使用 B+Tree
实现其索引结构。
与 B-Tree 相比,B+Tree 有以下不同点:
1. 每个节点的指针上限为 2d 而不是 2d+1。
2. 内节点不存储 data,只存储 key;叶子节点不存储指针。
图 3 是一个简单的 B+Tree 示意。
剩余25页未读,继续阅读
资源评论
苦茶子12138
- 粉丝: 1w+
- 资源: 6万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Windows系统下安装与配置Neo4j的步骤
- 基于matlab实现潮流计算和最优潮流计算的程序1,对毕业设计有一定用处.rar
- 基于大数据学习资源推荐系统的设计与实现(部署视频)-kaic.mp4
- 哈工大形式语言和自动机2022期末含答案
- Windows系统下安装与配置Neo4j的步骤
- 哈希算法(Hash Algorithm)是一种将任意长度的二进制数据映射为较短的、固定长度的二进制值的函数.txt
- Windows系统下安装与配置Neo4j的步骤
- 在二叉树或更复杂的树形结构中,先序输出叶结点.txt
- 列出所有祖先结点的概念通常与树形结构或图论中的节点相关.txt
- 基于matlab实现潮流计算程序,MATLAB潮流计算程序.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功