为什么我们需要数据库表索引


为什么我们需要数据库表索引

文章插图
> Photo by Todd Quackenbush on Unsplash
 
引入没有任何公式和计算机科学理论的B + Tree索引
如果您不是DBA或数据库开发人员 , 则可能不知道数据库索引的机制 。但是 , 只要您可以编写一些SQL查询 , 您就一定已经听说过数据库索引 , 并且知道索引可以提高SQL查询的性能 。
【为什么我们需要数据库表索引】在本文中 , 我将尝试使用最简单的语言和图表来说明B + tree索引如何改善SQL查询的性能 。我以B + tree索引为例的原因是
· 大多数关系数据库管理系统(例如MySQL , SQL Server和Oracle)都使用它
· 它可以提高大多数类型的SQL查询的性能 , 而不是特定类型的性能
它看起来怎样?
为什么我们需要数据库表索引

文章插图
> Photo by Shane Hauser on Unsplash
 
让我们简化该指令 , 这是一个简化的图 , 说明了B + tree索引的结构 。
为什么我们需要数据库表索引

文章插图
 
在上面的B + Tree示例中 , 每个矩形代表硬盘中的一个块 , 而蓝色填充点代表将这些块链接在一起的指针 。
为什么我们需要数据库表索引

文章插图
 
请注意 , 此图出于演示目的极大地简化了B + Tree , 因为它假定每个硬盘块只能包含2个键 。实际上 , 这将更大 。
重要的是要了解如何构造B + tree索引 。我们需要知道 , "叶子节点"级别假定具有创建此索引的字段的所有值 。在上面的示例中 , 很明显 , 我们在此表列中只有9行 , 其值从1到9 。
如果您对上述B + Tree的构建方式感兴趣 , 请参阅我的另一篇文章:如何在数据库中构建B + Tree索引?
它是如何工作的?
为什么我们需要数据库表索引

文章插图
> Photo by Maria Krasnova on Unsplash
 
B + tree可以帮助大多数数据库查询方案 , 这也是其有用的原因 。
均等测试查询假设我们的SQL查询是在条件为"等于"的情况下检索的 , 例如:
SELECT *FROM TABLEWHERE ID = 3
为了找到等于3的ID , 按如下方式使用B +树 。
为什么我们需要数据库表索引

文章插图
 
· 从树的顶层开始 , 3小于5 , 因此我们需要使用数字5左侧的指针
· 在下一级别 , 3在2到4之间 , 因此我们需要在中间使用指针
· 我们在叶子节点上有块 , 这里有3个
查询比较如果我们的SQL查询正在范围内搜索怎么办? 例如 , 这是SQL查询:
SELECT *FROM TABLEWHERE ID BETWEEN 3 AND 7
这是该过程的演示 。
为什么我们需要数据库表索引

文章插图
 
· 从树的顶层开始 , 3小于5 , 因此我们需要使用数字5左侧的指针
· 在下一级别 , 3在2到4之间 , 因此我们需要在中间使用指针
· 我们在叶子节点上有块 , 这里有3个
· 由于我们要查询比较数据 , 因此光标将继续在该代码块中获取 , 因此我们可以得到数字4
· 我们还没有到7 , 所以光标将继续转到下一个(右)叶子节点块
· 我们到达了下一个区块 , 所以我们得到了数字5和6 。但是它尚未完成 , 与上一步类似的机制将用于到达下一个区块 。
· 我们到达了包含数字7的下一个块
· 我们已经达到范围的上限 , 因此查询完成
B +树特征
为什么我们需要数据库表索引

文章插图
> Photo by Cristina Gottardi on Unsplash
 
B + Tree索引的最重要特征是它由树的叶节点级别和搜索关键字级别组成 。
· 该索引列的所有值都出现在叶节点中 。
· 非叶节点仅用于搜索目的 , 因此仅存在指向较低级别的指针 。换句话说 , 它们不能导致实际的数据输入 。
· 叶子节点中的每个键都有一个指向数据条目的额外指针 , 因此它可以导致光标查找/获取数据行 。


推荐阅读