Sql Server专题一:索引(中)
写在前面的废话: 索引这个知识点,我前前后后不知道看了多少边,网上的文章五花八门,搞的我晕头转向,搞的牛逼点的就是测试索引带来的好处,还搞一大堆的测试数据出来,有意思吗?MS自己不会测试吗?这样的测试有意思吗?这些测试我想知道为了证明什么……明显欺负我们这些不懂索引的屌丝。思来想去,自己动手丰衣足食!索引这东西就是个很抽象的东东,网上有很多跟索引一样抽象的文章,让我这屌丝实难看下去,更别说看懂了,看来看去,截至我写这片博客时,我仅仅知道索引分为聚集和非聚集索引……哈哈!无奈啊!下面我就从我的几个疑问开始,为自己解惑!继续学习,持续修改;本人片面之言,有错给予严厉的批评,以免传输错误知识!
1、为什么引入索引
2、索引为什么分类
3、索引的结构是怎样构建的
第一问? 为什么引入索引
一个大数据表,查找其中一条数据,怎么找?废话,当然一条条的找!会累啊!怎么办,像我这样聪明的人就开始想了,把数据给规范下,或者排个序啥的,查找就简单了,可是,怎样排序呢?将表中数据全部排序?每次有新数据进来都将新数据插入排好序的地方,这是笨方法!在想别办法,我可以再搞一个‘表’这样的东西,记录插入新数据的物理地址,这样在原有表的基础上,我新‘表’的数据量就小很多,这个小‘表’就是一个索引,里面的数据对查找数据是相当有用的,理论上需要两个字段,第一:真实数据的物理地址;第二:主键(哪个真实数据的物理地址);这是个小表,随我们怎么操作,但是对于建立索引之前的数据怎么处理?没办法,一条条的找,找到再将关键性的两个字段插入索引就OK了!所以在对已有大数据的表建索引的时候,很费劲的!总结:为了快点找到所需数据!
第二问? 索引为什么分类
针对上文所说的笨方法,其实就是聚集索引,将数据排序,MS是按照很上档次的平衡二叉树算法排序的,排序之后,数据就很规范的聚在一起了,就叫聚集索引,同样数据同样算法排序结果一样,索引聚集索引只有一个!这样看来,就接地气的多,什么算法,不就排个序吗?西方人,就喜欢搞名词,也无非是跟爱迪生一样一个个的试,哪个对大数据排序最快,就用那个算法!都说这是笨方法,MS默认的索引就不是聚集索引,谁闲着没事把大数据排序啊!人都是聪明的,当然采用聪明的方法!非聚集索引就是了,就是上文小表的做法,不动大数据,在搞个小表记录必要信息即可,在小表上找到主键对应的物理地址就oK了,拿着物理地址,直接就找到真实数据了!这样的小表可以有多个,真实数据的主键虽然是唯一的,但是有很多字段也是唯一的只不过没被选中作为主键,这样的字段也可以与物理地址一起构建一个新表,所以非聚集索引可以有多个,由于没有排序真实数据,真实数据也就没有按照一定规则紧挨着,所以就叫做非聚集!总结:为了快点找数据,一个聪明人和笨蛋的想出来的不同方法!另外,表有两种组织方式,B树(Balance Tree)或者堆(Heap)!也知道为什么了吧!B树表因为表数据被搞过了。
第三问? 索引的结构是怎样构建的 这个是重头戏
首先,我认为SQLSERVER的表结构,原本只有一种,就是堆,数据依次存储(数据按照我前面一片博客 Sql Server专题一:索引(上)
所说的按照数据页、区的规则存储在磁盘中);按照分区组队数据进行组织这样的存储,它不以任何人为指定的逻辑顺序进行排列。注意,MS对数据的管理就是根据这些区管理信息
和数据页管理信息
来控制的。下面大图1(摘抄:http://www.cnblogs.com/lwzz/archive/2012/08/05/2620824.html)。就是在物理上数据存储的样子,在物理上,数据之间是按照无序状态一条条存储的。在区管理信息中,指明数据页所在区的信息,包括了数据页的分配情况和物理地址等信息,具体的数据页便记录真实数据,堆,就是区和数据页的之间逻辑关系所形成的结构!数据页之间没有逻辑上的顺序!

在此基础上,如果对数据(数据页)进行排序(B树),就打破了堆的结构,还是个人认为区有关的管理信息不会有巨大改变,主要就是数据页,之前在堆中,数据页没有逻辑顺利,现在有了B树的逻辑顺序,数据页和数据页之间有了逻辑和物理上的关系! 在这些关系的最后,才是真实数据!下图就是聚集索引的物理结构!好好的堆结构,被人强制性的施加关系,导致数据页重新按照B树排列,无缘无故多了些关系!本来想拿数据就简单粗暴的在数据页中一个个的找就OK了,现在不行,必须通过关系一步步的才能找到最终数据!看似比原来复杂的多了!但大家都明白,这样的好处是大大的!

当然,我在第二个问题中说道,聚集索引其实是个笨方法,为什么呢!因为这样的代价有点大!聪明的方法也要实现吧!就是非聚集索引,他的关键主要就是小表,操作对象变为有真实物理地址和主键(哪个真实数据的物理地址)的表,既然B树排序深受广大人民热爱,索性将B树的排序照搬过啦即可!先不说真实的大数据所在的表,单说这个小表,经过B树排序理论上应该跟聚集索引的结构是一样的吧,目前为止,我觉得是一样的。只是你通过种种关系找到最后的小表里面没有数据,你还要在进入小表一次,查看所需数据的物理地址才能找到数据,理论上看似,聚集索引和非聚集索引无非就是一步之差!其实效果相差很大,这个有众多网友已经测试过了!在说真实大数据所在的表,其实根本没有变化,还是堆结构,仅仅是通过小表,变成逻辑上的B树结构。以为目前所理解的,非聚集索引应该指的真实大数据没有聚集(B树),其实小表进行了聚集(B树)看下图:

上图中(非聚集索引)最后一行的数据页,应该是不按照索引页中顺序排序的,如果是的话,跟聚集索引就一样了。
总结:SQL SERVER提供了两种索引:聚集索引和非聚集索引。其中聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大。非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,非聚集索引检索效率比聚集索引低,但对数据更新影响较小。B树索引,指的就是索引的本身结构是B树来着的。聚集和非聚集索引的结构都是B树。本文也多次提到B树,B树详情请参考,这位网友的博客:http://www.cnblogs.com/lwzz/archive/2011/07/27/2119021.html
本文主要参考了:http://www.cnblogs.com/lwzz/archive/2012/08/05/2620824.html
Sql Server专题一:索引(中)的更多相关文章
- SQL SERVER全面优化-------索引有多重要?
想了好久索引的重要性应该怎么写?讲原理结构?我估计大部分人不愿意看,也不愿意花那么多时间仔细研究.光写应用?感觉不明白原理一样不会用.举例说明?情况太多也写不全....到底该怎么写呢? 随便写吧,想到 ...
- SQL Server 深入解析索引存储(下)
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...
- SQL Server 列存储索引强化
SQL Server 列存储索引强化 SQL Server 列存储索引强化 1. 概述 2.背景 2.1 索引存储 2.2 缓存和I/O 2.3 Batch处理方式 3 聚集索引 3.1 提高索引创建 ...
- SQL Server 深入解析索引存储(非聚集索引)
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...
- SQL查询优化:详解SQL Server非聚集索引(转载)
本文是转载,原文地址 http://tech.it168.com/a2011/1228/1295/000001295176.shtml 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索 ...
- T-SQL查询高级--理解SQL SERVER中非聚集索引的覆盖,连接,交叉和过滤
写在前面:这是第一篇T-SQL查询高级系列文章.但是T-SQL查询进阶系列还远远没有写完.这个主题放到高级我想是因为这个主题需要一些进阶的知识作为基础..如果文章中有错误的地方请不吝指正.本篇文章 ...
- SQL Server 2008 安装过程中遇到“性能计数器注册表配置单元一致性”检查失败 问题的解决方法
操作步骤: 1. 在 Microsoft Windows 2003 或 Windows XP 桌面上,依次单击"开始"."运行",然后在"打开&quo ...
- SQL点滴12—SQL Server备份还原数据库中的小把戏
原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support 1 media families, ...
- Sql Server与.Net(C#)中星期值对比
最近发现Sql Server与.Net(C#)中星期值居然不匹配,倒不知道依哪一个了. 1.Sql Server declare @date datetime; set @date = '2017-0 ...
随机推荐
- GitLab CI
GitLab CI持续集成配置方案 目录 1. 持续集成介绍 1.1 概念 1.2 持续集成的好处 2. GitLab持续集成(CI) 2.1 简介 2.2 GitLab简单原理图 2.3 Git ...
- information_schema.partitions 学习
1.partitions 表中的常用列说明: 1.table_schema:表所在的数据库名 2.table_name:表名 3.partition_method:表分区采用的分区方法 4.parti ...
- log4net使用(包括单个文件和按日期生成多个文件)
1.log4net生成单个文件 直接将这段代码考到config中即可用 <log4net> <!--定义输出到文件中--> <appender name="Lo ...
- shell重定向
输入重定向 和输出重定向一样,Unix 命令也可以从文件获取输入,语法为: command < file 这样,本来需要从键盘获取输入的命令会转移到文件读取内容. 注意:输出重定向是大于号(&g ...
- Quartz.NET作业调度框架详解
Quartz.NET作业调度框架详解 http://www.cnblogs.com/lmule/archive/2010/08/28/1811042.html
- UESTC_秋实大哥带我飞 2015 UESTC Training for Graph Theory<Problem B>
B - 秋实大哥带我飞 Time Limit: 300/100MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- 用c++语言编写函数 int index(char *s,char * t),返回字符串t在字符串s中出现的最左边的位置,如果s中没有与t匹配的子串,则返回-1。类似于索引的功能。
首先,分析一下程序的思路: 1:从s的第i个元素开始,与t中的第1个元素匹配,如果相等,则将s的第i+1元素与t中的第2个元素匹配,以此类推,如果t所有元素都匹配,则返回位置i;否则,执行2; 2: ...
- C++ Primer 有感(异常处理)
1.异常是通过抛出对象而引发的.该对象的类型决定应该激活哪个处理代码.被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个. 2.执行throw的时候,不会执行跟在throw后面的语句 ...
- php错误日志级别
; E_ALL 所有错误和警告(除E_STRICT外) ; E_ERROR 致命的错误.脚本的执行被暂停. ; E_RECOVERABLE_ERROR ...
- RocketMQ与Kafka对比(18项差异)评价版
此文是rocketmq作者vintage.wang所写,对于每项对比,后面都增加了我的观点,有不对的地方,请各位指出. 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为 ...