索引深入浅出:索引简介

很多人对索引都没有一个清晰的认识,对于聚集索引和非聚集索引之间的区别也不是很清楚。如果有人问我索引是什么,我觉得这个问题有点大,很难在一篇文章里解释清楚。所以我决定尝试写这一系列文章,用一个简单的,可以理解的方法解释索引,尽管网上关于索引的文章有一箩筐那么多。

简单来说,索引帮助数据库引擎使用最小的资源,最高效的找到需要的数据。通过唯一列索引可以保证数据的连贯性,当索引不一定要建在唯一列上。在忙碌的系统里,通过增加并发操作,可以提高性能。在一个表上建立的各个索引可以满足不同用户的请求,但这也是个头疼的问题。索引保存在不同的页,就像数据存在不同的地方,SQL Server要保证它们的一致性。对表的任何INSERT,UPDATE,DELETE操作,对应的索引页会执行相同的操作。索引帮助我们提高获取数据的性能,但对DML操作却是个麻烦。在DELETE和UPDATE里,索引会帮助数据库引擎找到需要修改的记录。一个表要建多少个索引并没有诀窍(thrumb rule)。如果你要更好的读性能,你可以创建更多的索引,如果你要更好DML操作性能,请保持最小数量的索引。

SQL Server支持2类索引:

  • 聚集索引(Clustered Index:CI)
  • 非聚集索引(Non Clustered Index:NCI)

让我们用现实生活中的例子来理解这2类索引。假设你的邻居到你家,问你“Woody Tu”的电话号码。在这种情况下,电话本目录就是个聚集索引。你打开电话本目录,跳过3/4的页,假定他的名字应该出现在目录的最后一部分。在前后翻过几页后,你找到了列有“Woody Tu”名字的页。现在你就可以把号码告诉你的邻居了。看看这里发生了什么?当你找到了列有“Woody Tu”名字的页时,你就有了你邻居(客户端)需要的信息。

我们再看另一个情况,你的邻居到你家,问你“Woody Tu”的电子邮件地址,而你并不记得。在这个情况下,电话本目录会扮演非聚集索引的角色。你打开电话本目录,跳过3/4的页,假定他的名字应该出现在目录的最后一部分。在前后翻过几页后,你找到了列有“Woody Tu”名字的页。现在你可以打电话给“Woody Tu”,问下他的电子邮件地址是多少。挂下电话后,你可以把他的电子邮件地址交给你的邻居。看看这里发生了什么?当你找到了列有“Woody Tu”名字的页时,你并没有邻居(客户端)需要的信息。你需要去做一个额外操作(打电话)来获得邻居(客户端)需要的信息。在SQL Server里,这个额外操作被称为书签/RID查找(Bookmark or RID Lookup,注:RID,堆的行标识符(FileID:PageID:SlotNumber))。

希望这个介绍可以让你对聚集索引和非聚集索引有了感性的认识。在接下来的文章里,我们会讨论聚集索引和非聚集索引的更多细节。

时间: 2024-11-05 13:44:27

索引深入浅出:索引简介的相关文章

索引深入浅出:索引深入浅出的聚集索引页

本篇是“索引深入浅出”的开篇,也是这个系列文章的聚集索引页,下面文章标题排列顺序将和对应文章发布顺序一致: 索引简介:索引概述,通过现实生活实例理解聚集索引.非聚集索引还有键查找(Key Look up). 堆表:没有聚集索引的表叫堆表.在堆表中的数据存储没有任何顺序可言. 聚集索引的B树结构:有聚集索引的表叫聚集表.聚集索引使用B树结构的聚集健顺序,存储实际的数据.一个表只能有一个聚集索引.我们会谈到聚集索引的存储结构,还有对应访问方式. 非聚集索引的B树结构在聚集表:一个表可以创建多个非聚集

索引深入浅出:非聚集索引的B树结构在聚集表

一个表只能有一个聚集索引,数据行以此聚集索引的顺序进行存储,一个表却能有多个非聚集索引.我们已经讨论了聚集索引的结构,这篇我们会看下非聚集索引结构. 非聚集索引的逻辑呈现 简单来说,非聚集索引是表的子集.当我们定义了一个非聚集索引时,SQL Server把整套非聚集索引键存在不同的页里.我们来看下一个包含BusinessEntityID(PK),PersonType,FirstName,LastName这4列的表,这个表上有一个非聚集索引定义.主体表按BusinessEntityID列(聚集索引

索引深入浅出:非聚集索引的B树结构在堆表

在“索引深入浅出:非聚集索引的B树结构在聚集表”里,我们讨论了在聚集表上的非聚集索引,这篇文章我们讨论下在堆表上的非聚集索引. 非聚集索引可以在聚集表或堆表上创建.当我们在聚集表上创建非聚集索引时,聚集索引键担当为行指针.在堆表里,文件号,页号和槽号(file id , page number and slot number)的组合在非聚集索引里担当为行指针. 我们来看下手头的一个例子.我们创建salesorderdetail表的副本,并在上面的productid和salesorderid 列创

04 | 深入浅出索引(上) 学习记录

<MySQL实战45讲>04 | 深入浅出索引(上) 学习记录http://naotu.baidu.com/file/aa628e8feed77cf59b7a9e1e2c3f2c9e?token=bba3e87a29addf16 原文地址:https://www.cnblogs.com/jtfr/p/11257712.html

05 | 深入浅出索引(下) 学习记录

<MySQL实战45讲>05 | 深入浅出索引(下) 学习记录http://naotu.baidu.com/file/728c93bc6bbf5f51526451994de9306c?token=ef3290c5cdc90436 原文地址:https://www.cnblogs.com/jtfr/p/11257713.html

深入浅出索引(上)

南宁SEO:简单来说,索引的出现就是为了提高数据查询效率,就像书的目录一样. 索引的常见模型 索引实现的方式有很多种,所以这里就引入了索引模型的概念,可以用于提高读写效率的数据结构很多,比较常见的数据结果有以下三种:哈希表.有序数组和搜索树. 哈希表是一种以键值存储数据的结构,我们只要输入待查找的值即key,就可以找到对应的值即Value.哈希的思路很简单,把值放到一个数据里,用一个哈希函数把Key换算成一个确定的位置,然后把value放在数组的这个位置上.不可避免的,多个key通过哈希函数的换

深入浅出索引

在下面这个表T中,如果我们执行select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行? mysql> create table T ( id int primary key, k int not null default 0, name varchar(16) default '', index (k)) engine=InnoDB; mysql>insert into T values(100,1,'aa'),(200,2,'b

05 | 深入浅出索引(下)

回表:回到主键索引树搜索的过程,称为回表 覆盖索引:某索引已经覆盖了查询需求,称为覆盖索引,例如:select ID from T where k between 3 and 5 在引擎内部使用覆盖索引在索引K上其实读了三个记录,R3~R5(对应的索引k上的记录项),但对于MySQL的Server层来说,它就是找引擎拿到了两条记录,因此MySQL认为扫描行数是2 最左前缀原则:B+Tree这种索引结构,可以利用索引的"最左前缀"来定位记录 只要满足最左前缀,就可以利用索引来加速检索.

学习MongoDB 七: MongoDB索引(索引基本操作)(一)

一.简介 在MongoDB建立索引能提高查询效率,只需要扫描索引只存储的这个集合的一小部分,并只把这小部分加载到内存中,效率大大的提高,如果没有建立索引,在查询时,MongoDB必须执行全表扫描,在数据量大时,效率差别就很明显,对于包括一个没有索引的排序操作的查询,服务器必须在返回任何结果之前将所有的文档加载到内存中来进行排序. 索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构.索引项的排序支持高效的相等匹配和基于范围的查询操作.

高性能索引-高性能索引策略

1.独立的列 如果查询中的列不是独立的,则MySql就不会使用索引."独立的列"是指索引列不能是表达式的一部分,也不能是函数的参数. 2.前缀索引和索引的选择性 对于很长字符列,可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引的效率.但是会降低索引的选择性.索引的选择性是指:不重复的索引值(也称基数)和数据表的总记录数的比值.索引的选择性越高则查询效率越高.诀窍在于选择足够长的前缀以保证较高的选择性,同时又不能太长(以便节省空间).前缀索引是一种能使索引更小.更快的有效办