深入浅出理解索引

(一)深入浅出理解索引结构

  实际上,您可以把索引理解为一种特殊的目录。

  SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别。

  其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。

  我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

  如果您认识某个字,您可以快速地从自典中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。

  我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

  通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。

  进一步引申一下,我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。

  (二)何时使用聚集索引或非聚集索引

  下面的表总结了何时使用聚集索引或非聚集索引(很重要)。


动作描述


使用聚集索引


使用非聚集索引


外键列




主键列




列经常被分组排序(order by)




返回某范围内的数据



不应


小数目的不同值



不应


大数目的不同值


不应



频繁更新的列


不应



频繁修改索引列


不应



一个或极少不同值


不应


不应

  事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。

  聚集索引和非聚集索引深入浅出,希望能帮助您更好的理解两种索引的区别,下一篇博客我们谈下有关索引的基本语法结构及维护。

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-20 07:32:44

深入浅出理解索引的相关文章

SQL Server 索引结构及其使用(一)--深入浅出理解索引结构第1/4页_MsSql

一.深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引). 下面,我们举例来说明一下聚集索引和非聚集索引的区别: 其实,我们的汉语字典的正文本身就是一个聚集索引.比如,我们要查"安"字,就会很自然地翻开字典的前几页,因为"安"的拼音是"an",而按照

深入浅出理解MongoDB的设计与实现

本文来自中生代技术群talk show"深入浅出理解MongoDB的设计与实现"总结稿.MongoDB是NoSQL的一种,它是面向文档存储.但是为什么使用MongoDB呢? 以MongoDB为代表的NoSQL与传统的关系型数据库存储有何不同呢?本文精彩不容错过. MongoDB是NoSQL的一种,它是面向文档存储.为什么使用MongoDB?这要先从大数据说起,其中一个经典问题就是从互联网上抓数据.从互联网上我们能抓取大量的数据,那么就面临着存储,更新,查找,错误处理等问题.概括而言就是

mongodb系列02-------深入理解索引原理

之前对index的了解仅仅是停留在使用上面,一直都不太清楚index的原理没,那段时间专门看了一下,这里我梳理一下如果我们想要理解索引的原理,我们首先要了解一种最基本的数据结构Btree 就是balance tree ,这个图就是多路平衡排序树的一个例子,我们了解到每个节点的存储是按key-valuede形式存放的,一般一个节点的大小不会哦超过一个磁盘块的大小,这很重要,因为这关系到一个非常重要的指标IO次数,2,多路的,它不是二叉树,3,平衡树,数据有序,右侧数据一定会大于等于左侧的数据,并且

深入浅出理解javaScript原型链_javascript技巧

本文实例讲述了javaScript的原型链.分享给大家供大家参考.具体分析如下: 对于javascript原型链,以前都觉得是个很深的东西,一直没有理解很明白,今天看了一些介绍后,发现这张图,表示再没有什么语言能比这张图说得清楚了. 看了这张图后突然对javascript有了质的理解. javascript的原型链有显式和隐式两种: 显式原型链:即我们常见的prototype: 隐式原型链:在一般环境下无法访问,即不可见,在FireFox下可以通过__proto__方式访问:隐式原型链用于jav

深入浅出理解javaScript原型链

  这篇文章主要介绍了对javaScript原型链的理解,以实例形式对javaScript原型链的概念及相关使用技巧做了较为浅显易懂的分析,需要的朋友可以参考下 本文实例讲述了javaScript的原型链.分享给大家供大家参考.具体分析如下: 对于javascript原型链,以前都觉得是个很深的东西,一直没有理解很明白,今天看了一些介绍后,发现这张图,表示再没有什么语言能比这张图说得清楚了. 看了这张图后突然对javascript有了质的理解. javascript的原型链有显式和隐式两种: 显

深入浅出理解消息的传递和转发机制

前言 在面试过程中你也许会被问到消息转发机制.这篇文章就是对消息的转发机制进行一个梳理.主要包括什么是消息.静态绑定/动态绑定.消息的传递和消息的转发.接下来开发进入正题. 消息的解释 在其他语言里面,我们可以用一个类去调用某个方法,在OC里面,这个方法就是消息.某个类调用一个方法就是向这个类发送一条消息.举个例子: People *zhangSan = [[People alloc] init]; People *lisi = [[People alloc] init]; [zhangSan

SQL Server2000 索引结构及其使用

server|索引     一.深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引).下面,我们举例来说明一下聚集索引和非聚集索引的区别: 其实,我们的汉语字典的正文本身就是一个聚集索引.比如,我们要查"安"字,就会很自然地翻开字典的前几页,因为"安"的拼音是"

海量数据索引使用

数据|索引 随着"金盾工程"建设的逐步深入和公安信息化的高速发展,公安计算机应用系统被广泛应用在各警种.各部门.与此同时,应用系统体系的核心.系统数据的存放地――数据库也随着实际应用而急剧膨胀,一些大规模的系统,如人口系统的数据甚至超过了1000万条,可谓海量.那么,如何实现快速地从这些超大容量的数据库中提取数据(查询).分析.统计以及提取数据后进行数据分页已成为各地系统管理员和数据库管理员亟待解决的难题. 在以下的文章中,我将以"办公自动化"系统为例,探讨如何在有

SQL Server2000索引结构及使用方法

server|索引 一.深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引).下面,我们举例来说明一下聚集索引和非聚集索引的区别: 其实,我们的汉语字典的正文本身就是一个聚集索引.比如,我们要查"安"字,就会 很自然地翻开字典的前几页,因为"安"的拼音是"an