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

  先看一下下面的图,图是描述的在一个表上三个字段建了一个索引的情况,图分成三部分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. ubuntu安装miniconda

    系统:ubuntu15.04   64位 wget -c http://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh chm ...

  2. servlet&jsp高级:第五部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. SQL疑难杂症【3】链接服务器提示"无法启动分布式事物"

    今天接到用户反馈,应用系统出现异常,无法正常使用,于是用Profiler跟踪了一下语句,发现执行的存储过程中调用了链接服务器,做了一些跨服务器操作数据的动作,刚好就是这个链接服务器出错了,错误截图如下 ...

  4. installing a 3D printer

    托公司的福,今天可以自己组装一台3D打印机.心里颇有一种开箱有益的兴奋. 落入手中的是一台Panowin F1,价格不贵,却同时拥有了3D打印功能和激光打印功能.颇有一种小型创客作坊的雏形. 硬件搭建 ...

  5. CSS笔记(一)CSS规则

    CSS是层叠式样式表(Cascading Style Sheets)的缩写,定义了如何显示HTML元素. CSS规则由两个主要的部分构成:选择器 + 一条或多条声明. 每条声明由一个属性和一个值构成. ...

  6. spring的自动装配(default-autowire="byName")

    自动装配,官方给出的定义是这样:Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系.因此,如果可能的话,可以自 动让Spring通过检查BeanFactory中的内 ...

  7. 2013年5月~2013年11月份(转接关于ns51服务平台项目)相关资料:

    <1> [平台首页] 界面截图:(网络游客所看到的界面首页) <2>[注册] 有需求则注册会员(略...) <3>[个人空间] 注册成功后进入个人空间(有深层次的需 ...

  8. iOS - UITouch

    前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITouch : NSObject @available(iOS 2.0, *) public class UIT ...

  9. [转载] 跟着实例学习zookeeper 的用法

    原文: http://ifeve.com/zookeeper-curato-framework/ zookeeper 的原生客户端库过于底层, 用户为了使用 zookeeper需要编写大量的代码, 为 ...

  10. mysql 执行计划的理解

    1.执行计划就是在sql语句之前加上explain,使用desc 也可以.2.desc有两个选项extended和partitions,desc extended 将原sql语句进行优化,通过show ...