数据结构~Sqlserver索引使用的B树
B树相关概念
在B-树中查找给定关键字的方法是,首先把根结点取来,在根结点所包含的关键字K1,…,Kn查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功;否则,一定可以确定要查找的关键字在Ki与Ki+1之间,Pi为指向子树根节点的指针,此时取指针Pi所指的结点继续查找,直至找到,或指针Pi为空时查找失败。
时间复杂度
动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度
O(log2N)
与树的深度相关,那么降低树的深度自然会提高查找效率。
在SQLSERVER里的表现
我们都知道sqlserver数据行的存储结构有两种:堆(heap)和B树(binary二叉树)。学过数据结构的人都知道,二叉树的优点是:快速使用二分法找到数据,数据页面使用双向链表首尾相连。再介绍一下数据结构中的堆(heap)。堆中的数据没有任何顺序,数据页面也不会首尾相连。那怎么在堆中查找数据呢? 堆的结构及IAM结构如下:
堆表只依靠表里的IAM页(索引分配映射页)将堆的页面联系在一起,IAM中记录了页面编号和页面位置。由此可以通过IAM扫描数据。
1.很多书中都讲到sqlserver数据行的存储结构有两种:堆(heap)和B树(binary二叉树)。而我觉得sqlserver数据页的存储结构有两种:堆(heap)和B树(binary二叉树)。
2.数据都存在页面中,sqlserver页面有两种类型:数据页和索引页。索引页都是按照B树结构存储的。
那么重点来了:
不管是聚集索引,还是非聚集索引,索引数据都存放在索引页中。
表中如果有聚合索引,那么数据全部存储在索引页中。
表中如果只有有非聚合索引,那么数据存在堆页(也就是实际的数据行),但是索引数据存储在索引页中。
表中如果既有聚集索引,也有非聚集索引,那么数据和索引都存放在索引页中。
B树结构中,每一个节点就是一个页面,B树里会有一页:root page(亦即是根节点),非聚集索引和聚集索引都是一样的。
下面开始步入正轨介绍索引:
聚集索引:
有人会问为什么一张表只能有一个聚集索引,简单来说因为表只能以一种顺序排列在磁盘中,所以表只能有一个聚集索引。而非聚集索引能有好几个。
聚集索引因为数据全部存放在索引页中,所以顺着聚集索引就可以查到数据。聚集索引结构如下:
非聚集索引
1.如果非聚集索引的数据放在堆表中(表示没有聚集索引),而非聚集索引的数据放在索引页中。那么非聚集索引怎么查找数据呢?在非聚集索引的叶子节点(即叶子页面)有行定位器,行定位器指向行的位置。由文件标示符、页码、行上的行数组成。整个指针称为行ID(RID)。
2.如果非聚集索引的数据放在索引表中(表示有聚集索引),那怎么查找数据呢?则行定位器会指向聚集索引键。SQL使用非聚集索引叶子节点的指针指向的聚集索引键值,来查找数据。
数据结构~Sqlserver索引使用的B树的更多相关文章
- 算法和数据结构~Sqlserver索引使用的B树
B树相关概念 在B-树中查找给定关键字的方法是,首先把根结点取来,在根结点所包含的关键字K1,…,Kn查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功:否则,一定可以 ...
- sqlserver 索引的结构及其存储,索引内容
sqlserver 索引的结构及其存储,sql server索引内容 文章转载,原文地址: http://www.cnblogs.com/panchunting/p/SQLServer_IndexSt ...
- 【数据结构】B-Tree, B+Tree, B*树介绍
[摘要] 最近在看Mysql的存储引擎中索引的优化,神马是索引,支持啥索引.全是浮云,目前Mysql的MyISAM和InnoDB都支持B-Tree索引,InnoDB还支持B+Tree索引,Memory ...
- 【数据结构】B-Tree, B+Tree, B*树介绍 转
[数据结构]B-Tree, B+Tree, B*树介绍 [摘要] 最近在看Mysql的存储引擎中索引的优化,神马是索引,支持啥索引.全是浮云,目前Mysql的MyISAM和InnoDB都支持B-Tre ...
- 为什么MySQL数据库索引选择使用B+树?
在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...
- Java数据结构和算法(一)树
Java数据结构和算法(一)树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 前面讲到的链表.栈和队列都是一对一的线性结构, ...
- MySQL 学习 --- 数据结构和索引
本文参考了多篇文章集成的笔记,希望各位学习之前可以阅读以下参考资料先 概述 文章分几个部分 :第一部分介绍了B-Tree 和 B+Tree 这种数据结构作为索引:第二部分介绍索引的最左前缀原则和覆盖索 ...
- 数据库——MySQL——索引——索引原理及B+树
索引原理 我们使用索引,就是为了提高查询的效率,如同查书一样,先找到章,再找到章中对于的小节,再找到具体的页码,再到我们需要的内容. 事实上索引的本质就是不断缩小获取数据的筛选范围,找出我们想要的结果 ...
- java数据结构和算法08(B树的简单原理)
这一篇首先会说说前面剩余的一点知识2-3树,然后简单说说B树,不写代码,只是简单看看原理吧! 为什么要说一下2-3树呢?了解2-3树之后能更快的了解B树: 1.简单看看2-3树 其实我们学过了前面的2 ...
随机推荐
- 5.1JAVA基础复习——JAVA中的静态代码块、构造代码块、构造函数、局部代码块区别
构造代码块: 在类中定义可以给所有对象进行初始化.局部代码块: 在方法中定义属性的生命周期.静态代码块: 在类中定义用于给类调用时属性的初始化 构造函数与构造代码块的区别: 构造函数是给对应的对象进行 ...
- python list用法
a = ['张三','李四','赵六','王五'] #打印列表 print(a) #增 a.apppend('徐七') print(a) a.insert(1,'张六') print(a) #删 a. ...
- PHP代码-数据爬取(a标签和a标签所对应的内容)
public function export(){ set_time_limit(1000); // header("Content-type: text/html; charset=utf ...
- SSM学习(一)Mybatis
Mybatis Notes Mybatis First 创建Maven项目 配置依赖 <dependencies> <dependency> <groupId>ju ...
- Text ------widget树由两个widget:Center(及其子widget)和Text组成
import 'package:flutter/material.dart'; void main() => runApp(new Center( child: new Text( 'Hello ...
- error——Fusion log——Debugging Assembly Loading Failures
原文 So...you're seeing a FileNotFoundException, FileLoadException, BadImageFormatException or you sus ...
- Windows server 2012 install .net core sdk 2.2.103
Windows8.1-KB2919442-x64 Windows8.1-KB2919355-x64 vc_redist.x64 dotnet-sdk-2.2.103-win-x64 dotnet-ho ...
- Django中的FBV与CBV
一. FBV FBV(function based views) 基于函数的视图, 即一个url对应一个视图函数. 1.1 FBV代码示例 urls.py from django.contrib im ...
- docker run -v参数
挂载目录(直接给例子吧) -v=[]:绑定挂载目录 宿主机绑定: -v<host>:<container>:[rw|ro] 在Docker中新建一个共享的卷: -v /< ...
- laravel——基础增删改查
一.控制器代码 <?php namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; class CurdContro ...