Sql Server数据库索引按照物理实现方式分类,索引可以分为 2 种:聚集索引和非聚集索引。
通常也把非聚集索引称为二级索引或者辅助索引。
聚集索引可以按照主键来排序存储数据,这样在查找行的时候非常有效。
举个例子,如果是一本新华字典,我们想要查找“好”这个字,直接在书中找汉语拼音的位置即可,也就是拼音“hao”。这样找到了索引的位置,在它后面就是我们想要找的数据行。
非聚集索引不会把索引指向的内容像聚集索引一样直接放到索引的后面,而是维护单独的索引表(只维护索引,不维护索引指向的数据),为数据检索提供方便。
我们还以新华字典为例,如果想要查找“好”字,那么按照部首查找的方式,先找到“好”字的偏旁部首,然后这个目录会告诉我们“好”字存放到那一章节第多少页,我们再去指定的页码找这个字。
也就是说系统会进行两次查找,第一次先找到索引,第二次找到索引对应的位置取出数据行。
聚集索引和非聚集索引二者的区别
聚集索引与非聚集索引的原理不同,在使用上也有一些区别:
聚集索引的叶子节点存储的就是具体的数据记录,非聚集索引的叶子节点存储的是数据位置。非聚集索引不会影响数据表的物理存储顺序。
一个表只能有一个聚集索引,因为只能有一种排序存储的方式,但可以有多个非聚集索引,也就是多个索引目录提供数据检索。
使用聚集索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚集索引低。
Sql Server索引碎片
1、数据库的存储本身是无序的,建立聚集索引之后,就会按照聚集索引的物理顺序存入硬盘;
2、建立索引完全是为了提升读取的速度,相对写入的速度就会降低,没有索引的表写入时最快的,但是大多数系统读的频率要高于写的频率;
3、索引碎片分为内部碎片和外部碎片。
内部碎片:是指索引页没有100%存储满,有剩余空间,这就是内部碎片;产生原因是在insert或者update数据时,该页不足以放下新增或更新的数据,造成分页,导致索引页的平均密度变小,就产生了内部碎片;
外部碎片:是指做插入或更新操作时,原来页无法容纳新的行,导致分页(分页会将原来页大约一半的数据放到新页上,达到一个平衡状态),而新的页和原来的页在物理上又不连续了(分页之前,他们之间有好多页面),而聚集索引要求行之前是连续的,所以分页后,新叶和原来页物理上的不连续是造成外部碎片的原因。
4、索引碎片解决方案:①DBCC SHOWCONTIG('TableName') 检查碎片程度 ②DBCC DBREINDEX('TableName') 重建索引