索引是什么html
数据库中的索引相似于一本书的目录,在一本书中使用目录能够快速找到你想要的信息,而不须要读彻底书。在数据库中,数据库程序使用索引能够快速查询到表中的数据,而没必要扫描整个表。书中的目录是一个字词以及各字词所在的页码列表,数据库中的索引是表中的值以及各值存储位置的列表。数据库
例如:数据库中有20000条记录,如今要执行这样一个查询:SELECT * FROM tableName WHERE num=10000。若是没有索引,必须遍历整个表,直到num=10000的这一行为止;若是在num列上建立索引,SQL Server不须要任何扫描,直接在索引里面找10000,就能够得知这一行的位置。可见,索引的创建能够加快数据的查询速度。ide
不一样数据库中提供了不一样的索引类型,SQL Server中的索引有两种:汇集索引和非汇集索引。它们的区别是在物理数据的存储方式上。性能
没有汇集索引的数据表都称为堆表。即便上面有非汇集索引,也仍是堆表。ui
汇集索引基于数据行的键值,在表内排序和存储这些数据行。每一个表只能有一个汇集索引,由于数据行自己只能按一个顺序存储。spa
汇集索引的全部的数据都存储在叶子节点上,数据查询的复杂度都是同样的(树的深度),按照汇集索引列查找数据效率是很是高的。.net
上面说了,汇集索引决定了表的物理存储结构,那若是没有建立汇集索引,会如何呢?设计
表内的全部页都无序存放,是一个无序的堆结构。堆数据的查询就会形成表扫描,性能是很是低的。指针
所以汇集索引的的重要性不言而喻,通常来讲,大多会对主键创建汇集索引,大多数普通状况这么作也能够。code
但实际应用应该尊从一个原则就是“频繁使用的、排序的字段上建立汇集索引”
提示:SQL Server中,一个表只能建立1个汇集索引,多个非汇集索引。设置某列为主键,该列就默认为汇集索引。
非汇集索引就至关于使用字典的部首查找,非汇集索引是逻辑上的连续,物理存储并不连续。
PS:汇集索引一个表只能有一个,而非汇集索引一个表能够存在多个。
除了汇集索引之外的其余索引,都称之为非汇集索引。一般,设计非汇集索引是为了改善常用的、没有创建汇集索引的查询的性能。
建立惟一非汇集索引
CREATE UNIQUE INDEX ProviderInfo_Id_uindex ON dbo.ProviderInfo(Id)
非汇集索引也是B树(B+树和B-树)的结构,与非汇集索引的存储结构惟一不同的,就是非汇集索引中不存储真正的数据行。
汇集索引中已经存放了全部数据,非汇集索引只包含一个指向数据行的指针便可。
非汇集索引的建立会单首创建索引文件来存储索引结构,会占用必定存储空间,就是用空间换时间;
非汇集索引的目的很单纯:提升特定条件的查询效率,一个表有可能根据多种查询需求建立多个非汇集索引;
汇集索引与非汇集索引
在汇集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个汇集索引,默认是主键列,汇集索引一般提供更快的数据访问速度。
非汇集索引能够有多个,物理顺序与键值的逻辑(索引)顺序能够不相同。一个简单的例子:对一个教室的学生,每一个人都有一个座位号(座位是物理存在的,只有一种排序,这就是汇集索引),咱们能够按学生的年龄、身高、体重排序(这样排出来的顺序座号不连续即物理上不连续,在逻辑上是连续的,就是非汇集索引)
每一行的索引值都是惟一的(建立了惟一约束,系统将自动建立惟一索引)
5.列式存储索引
列存储索引是SQL Server 2012中为提升数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不一样于汇集索引、非汇集索引及堆表等以行为单位的方式存储。
什么是包含列?
所谓的包含列就是包含在非汇集索引中,而且不是索引列中的列。或者说的更通俗一点就是:把一些底层数据表的数据列包含在非汇集索引的索引页中,而这些数据列又不是索引列,那么这些列就是包含列。同时,这些包含列并不会对索引中的条目有影响。
为何要建立带有包含列的索引?
把须要用到的字段放到包含索引中(在返回的索引中就包含了一切),不用再查物理表,能够达到最优的速度。
何时须要创建带有包含列的索引,何时不须要创建带有包含列的索引?
其实把一些列做为包含列放在索引结构中就是一种用“空间换时间”的策略。
这个时候,你们可能就会问了:“何须把列放在包含列中这么麻烦,为何不直接放在索引中?”。
其实把那三个列放在包含列而不是索引列中有如下几个好处:
总结:如何把一些列做为包含列放在索引中,那么就能够在必定的程度上面提高效率,能够把本来须要整表扫描的操做,改成非汇集索引扫描,这样的成本更小。
字段上只有【男】或【女】两个不一样值,所以就无需创建索引,若是创建索引,不但不会提升查询效率,反而会严重下降更新速度。
在频繁进行排序或分组(即进行GROUP BY 或ORDER BY操做)的列上创建索引,若是待排序的列有多个,能够在这些列上创建组合索引。
前面说过了,索引在使用一段时间后(主要是新增、修改、删除数据,若是该页已经存储满了,就要进行页的拆分,频繁的拆分,会产生较多的索引碎片)会产生索引碎片,这就形成了索引页在磁盘上存储的不连续。
在表上建立一个惟一的索引。惟一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX ProviderInfo_Id_uindex ON dbo.ProviderInfo(Id)
https://www.cnblogs.com/knowledgesea/p/3672099.html
https://www.cnblogs.com/selene/p/4474721.html
https://blog.csdn.net/zc474235918/article/details/50580639