在前一个创建索引中已经大概说了三部分的影响,基本应该注意哪一些。写完上一篇后我感觉有很多地方没有写清楚,所以这篇就是更深入一些的理解索引到底是怎么和数据表关联,怎么快速查询的。

  先看一下下面的图,图是描述的在一个表上三个字段建了一个索引的情况,图分成三部分A,B,C。下面慢慢来看这几部分。

  A部分,这个是B树的一个缩略图,方便习惯平时的思维。
  B部分,这个就是详细的数据排列情况了,举了几个简单的例子,但是大概能看出索引节点里面数据的关系了。这里就像前一篇中想像成group by 后面的列一样,先排哪个,后排列哪个,那么哪些结构可能会用到这个索引呢?下面我分别列出几个查询,看哪些能用到

1)select * from tb where a>10;
2)select * from tb where b>10;
3)select * from tb where c>'h';
4)select * from tb where b>10 and a>10;
5)select * from tb where b>10 and c>'h';
6)select * from tb where a>10 and c>'h';

  B树的查询是从根节点进入的,其实也就是看这些条件哪些能从根节点时入,我们这里不考虑索引扫描的情况,其实SQLServer的索引叶之前还有指针,有时也会用到索引扫描,这里我们只考虑索引查找的情况,假设数据比较大,分部均匀。

  根节点的区别是从a开始的,其实我图中数据没有举好,其实在上面两个节点之间也可以有 45,200,x这种类型的数据,所以能用到索引的是用到a条件的1),4),6)其中第4)个位置对换是对逻辑没有影响的。

  C部分,这个是最重要的一部分,就是图中有色彩的部分,我为什么经常把图画成这样横过来其实就是为了这个很符合我们的习惯。

  看图上,我写了列1,列2 ....列n和页1,页2....页n,这个就和我平时查询表的展示一样,一列一列的,只是而是这样包含所有列的1行或多行,如果一行空间足够大,可以一行就是一个页,平时我们用的多数是多行放到一个列里面。接下来就是说一下查询读取数据的整个过程了。

    先是经过A部分可以快速(索引提速就在这里)的查询到所要数据的范围。
再通过索引键去找到数据。
最后读取这些页出来(这里要注意读数据最基本的单位是页,就是你只有一行数据,也会读取一页出来)

  上面说了步聚,我们重点来看一下第三步。

  1)就算你只读取一行数据,也会读取一整页出来。比如下面查询

select top 1 * from tb where a>10;

  这个在最后读取是一个页的数据出来,所以这里SQLServer会有优化的空间。

  2)就算你只读取一两列少数数据也会读取一整页出来。比如下面查询

select [列1],[列2] from tb where [列1]>10;

  这个在最后读取的是在条件范围内的所有页,也就是也读取了列3到列n的数据。所以这里SQLServer会有优化的空间,SQLServer2012在这里也做了优化,可以创建以列为索引的列存储索引(ColumnStore Index),当然这个有她的好处,也有不方便的地方,她不能随时更新删除之类的操作,但是他对静态数据的查询是很有效的,比如一个ip库,里面有ip,地名,公司名,还有其它一些列,在这个表上有很多不同的查询,有查地名,有查公司等,这个用这种列存储过引就很有效果,其实这里的例实很有限,你说地名,公司名基本不会占用太大的空间,大概意思到位就行了吧。

  最后是总结了,本文主要内容
  1,索引B树(图中A部分)
  2,索引B树存储结构(图中B部分,带上数据),索引覆盖(那几个查询例子)
  3,索引与数据关系,怎么查询的整个过程

数据库索引<二> 补充前篇 (上一篇抽风了,这个补上)的更多相关文章

  1. 数据库索引<二> 补充前篇

    你要准备的软件有: 最新版 Rsync for windows 服务端:cwRsync_Server_2.1.5_Installer.zip 客户端:cwRsync_2.1.5_Installer.z ...

  2. 数据库索引<二> 如何创建索引

    前面一篇说法了索引结构,和几种索引在数据表上的结构,了解了索引可以为查询服务,这篇说一说如何创建索引. >平时可能的创建方式 这个系统中要用到A字段,B字段,C字段做为查询的条件,联接的条件较多 ...

  3. SQL Server调优系列进阶篇(如何维护数据库索引)

    前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...

  4. SQL Server调优系列进阶篇 - 如何维护数据库索引

    前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...

  5. SQL Server 调优系列进阶篇 - 如何维护数据库索引

    前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...

  6. MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引

    这个系列文章会分为两篇来写: 第一篇:入门篇,学习使用MongoDB数据库索引 第二篇:进阶篇,研究数据库索引原理--B/B+树的基本原理 1. 准备工作 在学习使用MongoDB数据库索引之前,有一 ...

  7. MySQL数据库索引(上)

    上一篇回顾: 1.数据页由七部分组成,包括File Header(描述页的信息).Page Header(描述数据的信息).Infimum + Supremum(页中的虚拟数据最大值和最小值).Use ...

  8. Python之路【第二十四篇】:数据库索引

    数据库索引 一.索引简介 索引在mysql中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈 ...

  9. mysql进阶(二十七)数据库索引原理

    mysql进阶(二十七)数据库索引原理 前言   本文主要是阐述MySQL索引机制,主要是说明存储引擎Innodb.   第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础.    ...

随机推荐

  1. CUBRID学习笔记 21 查看主键外键索引

    命令 show create table game; game是表名 在web管理中,请在sql标签中查,不要在query中执行. show create table game; === <Re ...

  2. git学习笔记11-git多人协作-实际多人怎么开发

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git remote: $ git r ...

  3. iOS - Swift 数据持久化

    1.Sandbox 沙箱 iOS 为每个应用提供了独立的文件空间,一个应用只能直接访问为本应用分配的文件目录,不可以访问其他目录,每个应用自己独立的访问空间被称为该应用的沙盒.也就是说,一个应用与文件 ...

  4. c++操作io常见命令

    用c++练习下 系统常见io命令. 1)显示文档的文本 2)统计文本单词数字 3)列出目录所有文件 ,递归思路 4)查找第一个匹配的字符. 5)文本单词排序, 快速排序,其实还是递归思路 6)文本单词 ...

  5. c trans

    #define BUFSIZE 100 char buf[BUFSIZE]; ; int getch(void) { )? buf[--bufp] : getchar(); } void ungetc ...

  6. 值类型,引用类型,栈,堆,ref,out

    在网上收集... C#的值类型,引用类型,栈,堆,ref,out C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C# ...

  7. CSS重置代码和常用公共代码

    发的发生的发生法士大夫撒打发士大夫

  8. python把str转换为int

    def str2int(s): def fn(x,y): return x+y def char2num(s): ':9}[s] return reduce(fn,map(char2num,s)) ' ...

  9. hiho_99_骑士问题

    题目大意 给定国际象棋8x8棋盘上三个起始点,三个骑士分别从三个起始点开始移动(骑士只能走日字,且骑士从任意一点出发可以走遍整个棋盘).现要求三个骑士汇聚到棋盘上某个点,且使得骑士到达该点所移动的次数 ...

  10. python操作mongodb之六自定义类型存储

    from pymongo.mongo_client import MongoClient client=MongoClient('192.168.30.252',27017) client=drop_ ...