难检字笔画索引是什么意思 索引是什么意思


难检字笔画索引是什么意思 索引是什么意思

文章插图
概述
学数据库一定要对其中索引是怎么设计去做个探讨,由一个点逐步深入学习,下面以索引为入口探讨下sqlserver数据库 。
01索引概念
索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录可以快速找到你想要的信息,而不需要读完全书 。在数据库中,数据库程序使用索引可以重啊到表中的数据,而不必扫描整个表 。书中的目录是一个字词以及各字词所在的页码列表,数据库中的索引是表中的值以及各值存储位置的列表 。
索引的利弊:查询执行的大部分开销是I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读取表的每一个数据页,如果有索引指向数据值,则查询只需要读少数次的磁盘就行 。所以合理的使用索引能加速数据的查询 。但是索引并不总是提高系统的性能,带索引的表需要在数据库中占用更多的存储空间,同样用来增删数据的命令运行时间以及维护索引所需的处理时间会更长 。
02聚集索引和非聚集索引
sqlserver的索引分为聚集索引和非聚集索引
1、 聚集索引
表的数据是存储在数据页中(数据页的PageType标记为1),SqlServer一页是8k,存满一页就开辟下一页存储 。如果表有聚集索引,那么一笔一笔物理数据就是按聚集索引字段的大小升/降排序存储在页中 。当对聚集索引字段更新或中间插入/删除数据时,都会导致表数据移动(造成性能一定影响),因为它要保持升/降排序 。
注意,主键只是默认是聚集索引,它也可以设置为非聚集索引,也可以在非主键字段上设置为聚集索引,全表只能有一个聚集索引 。
一个优秀的聚集索引字段一般包含以下4个特性:
(1)自增长
总是在末尾增加记录,减少分页和索引碎片 。
(2)不被更改
减少数据移动 。
(3)唯一性
唯一性是任何索引最理想的特性,可以明确索引键值在排序中的位置 。
更重要的是,索引键指唯一的话,它在每条记录里才可以正确指向源数据行RID 。如果聚集索引键值不唯一,SqlServer就需要内部生成uniquifier 列组合当作聚集键保证“键值”唯一性;如果非聚集索引键值不唯一,就会增加RID列(聚集索引键或者堆表中的行指针)保证“键值”唯一性 。
为了“键值”唯一性,对于聚集索引,uniquifier 列只在索引值重复时增加 。对于非聚集索引,如果创建索引时没定义唯一,RID会在所有记录增加,就算索引值是唯一的;如果创建索引时定义唯一,RID只在叶子层增加,用于查找源数据行,即书签查找操作 。
(4)字段长度小
聚集索引键长度越小,一页索引页就可以容纳更多索引记录,进而减少索引B树结构的深度 。例如,一个百万记录的表有一个int聚集索引,可能只需要3层的B树结构 。如果把聚集索引定义在更宽的列(比如uniqueidentifier列需要16 字节),那么索引的深度会增加到4层 。任何聚集索引查找需要4个I/O操作(确切的说是4个逻辑读),原先只要3个I/O操作 。
同样,非聚集索引里会包含聚集索引键值,聚集索引键长度越小非聚集索引记录也就越小,一页索引页就可以容纳更多索引记录 。
2、 非聚集索引
也是存储在页中(PageType标记为2的页,叫索引页) 。比如表T建立了一个非聚集索引Index_A,那么表T有100条数据的话,那么索引Index_A也就有100条数据(准确的说是100条叶子节点数据,索引是B树结构,如果树的高度大于0,那么就有根节点页或中间节点页数据,这时索引数据就超过100条),如果表T还有非聚集索引Index_B,那么Index_B也是至少100条数据,所以索引建越多开销越大 。

推荐阅读