--查看索引命中详情:
set statistics time on
set statistics io on
set statistics profile on
select* from 表名
使用索引好处:执行原理(https://blog.csdn.net/m0_38128121/article/details/79663261)
b+树:非叶子节点不存储真实的数据,只存储指引搜索方向的数据项
b+树的查找过程
如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。
————————————————
版权声明:本文为CSDN博主「蹲茅坑逗蛆蛆」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_38128121/article/details/79663261
原文链接:https://blog.csdn.net/m0_38128121/article/details/79663261
时间复杂度O(log n) n是记录总数,底数是树的分叉数,结果就是树的层次数
概述:聚簇索引的数据的物理存放顺序与索引顺序是一致的
数据行的物理顺序与列值的顺序相同,如果我们查询id比较靠后的数据,那么这行数据的地址在磁盘中的物理地址也会比较靠后。而且由于物理排列方式与聚集索引的顺序相同,所以也就只能建立一个聚集索引了。
1.SQLServer索引有两种,聚集索引和非聚集索引;
2.聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。
3.聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。
非聚集索引的二次查询问题
非聚集索引叶节点仍然是索引节点,只是有一个指针指向对应的数据块,此如果使用非聚集索引查询,而查询列中包含了其他该索引没有覆盖的列,那么他还要进行第二次的查询,查询节点上对应的数据行的数据。
聚簇索引与非聚簇索引(也叫二级索引 执行过程)--最清楚的一篇讲解(https://cloud.tencent.com/developer/article/1541265)
注意点:
聚集索引没有Bookmark Lookup操作。
非聚集索有Bookmark Lookup操作,因为得到一行数据起码有两次IO,一次访问索引(聚集索引),一次访问基本表。
索引分为索引查找(Seek)和索引扫描(Scan)
索引是一颗B树,
index seek是查找从B树的根节点开始,一级一级找到目标行。(效率高)
index scan则是从左到右,把整个B树遍历一遍。(相当于从杂乱无序的堆中查找数据)
【假设唯一的目标行位于索引树最右的叶节点上(假设是非聚集索引,树深度2,叶节点占用k页物理存储)。
index seek引起的IO是4,而index scan引起的IO是K,性能差别巨大。】
索引失效: https://www.cnblogs.com/kerrycode/p/4806236.html
创建非聚集索引:(NONCLUSTERED 非聚集)
CREATE NONCLUSTERED INDEX [索引名] ON [dbo].[System_HTE_Basic_HteAndSubHte]
(
[HTEID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
如何创建索引
创建索引的语法:
CREATE [UNIQUE][CLUSTERED | NONCLUSTERED] INDEX index_name ON {table_name | view_name} [WITH [index_property [,....n]]
说明:
UNIQUE: #建立唯一索引。
CLUSTERED: #建立聚集索引。
NONCLUSTERED: #建立非聚集索引。
Index_property: #索引属性。
#UNIQUE索引既可以采用聚集索引结构,也可以采用非聚集索引的结构,如果不指明采用的索引结构,则SQL Server系统默认为采用非聚集索引结构。
#删除索引语法:
DROP INDEX table_name.index_name[,table_name.index_name]
说明:table_name: 索引所在的表名称。
index_name : 要删除的索引名称。
显示索引信息:
使用系统存储过程:sp_helpindex 查看指定表的索引信息。
执行代码如下:
Exec sp_helpindex book1;
数据库索引原理 b树
(33条消息) 数据库索引原理 b树_coolwriter的博客-CSDN博客_b树索引
标签:index,name,查看,聚集,索引,IO,命中,磁盘 From: https://www.cnblogs.com/kkbk/p/17701920.html