浅谈B-树以及数据库聚集索引、非聚集索引
数据库聚集索引和非聚集索引
数据库聚集索引和非聚集索引数据库聚集索引和非聚集索引是数据库中两种常见的索引类型,它们在优化数据库性能和提高查询效率方面起着重要的作用。
本文将对这两种索引进行详细介绍。
一、数据库聚集索引聚集索引是一种物理排序的索引方式,它按照索引的列值对表中的数据进行排序,并将数据存储在磁盘上。
一个表只能有一个聚集索引,它决定了表中数据的物理存储顺序。
聚集索引的主要作用是提高表的查询性能,特别是针对那些基于范围的查询。
聚集索引的构建过程是将表中的数据按照索引列的顺序进行排序,并创建一个包含索引列和指向数据行的指针的B+树索引结构。
当执行查询时,数据库引擎可以利用聚集索引的有序性,通过二分查找等算法快速定位到目标数据行,从而提高查询效率。
聚集索引对于频繁进行范围查询的表非常有用,例如时间序列数据表或者按照某个特定顺序进行查询的表。
同时,聚集索引也可以提高插入和更新操作的性能,因为数据行的插入和更新操作会根据聚集索引的顺序进行物理存储,减少了数据移动的开销。
二、数据库非聚集索引非聚集索引是一种逻辑排序的索引方式,它并不改变数据在表中的物理存储顺序,而是创建一个独立的索引结构来提高查询性能。
一个表可以有多个非聚集索引,它们可以基于单个或多个列进行构建。
非聚集索引的构建过程是创建一个包含索引列和指向数据行的指针的B+树索引结构。
当执行查询时,数据库引擎根据查询条件在非聚集索引中进行搜索,并获取到指向数据行的指针,然后再通过指针找到对应的数据行。
由于非聚集索引并不改变数据的物理存储顺序,因此查询数据时需要进行两次查找操作,一次是在非聚集索引中进行搜索,另一次是在数据行中获取具体数据。
非聚集索引适用于那些经常进行精确查找的表,例如根据主键或唯一约束进行查询的表。
它可以大大提高这类查询的性能,减少了数据库引擎扫描整个表的开销。
三、聚集索引与非聚集索引的比较聚集索引和非聚集索引在索引构建方式和查询性能方面存在一些差异。
1. 构建方式:聚集索引按照索引列的顺序对数据进行排序,改变了数据的物理存储顺序;非聚集索引则创建了一个独立的索引结构,不影响数据的物理存储顺序。
B+-Tree原理及mysql的索引分析
B+/-Tree原理及mysql的索引分析标签:mysqlMySQLMysqlMYSQL2012-12-23 17:09 8236人阅读评论(2) 收藏举报本文章已收录于:MySQL知识库分类:mysql(18)版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+] B+/-Tree原理B-Tree介绍B-Tree是一种多路搜索树(并不是二叉的):1.定义任意非叶子结点最多只有M个儿子;且M>2;2.根结点的儿子数为[2, M];3.除根结点以外的非叶子结点的儿子数为[M/2, M];4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)5.非叶子结点的关键字个数=指向儿子的指针个数-1;6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;8.所有叶子结点位于同一层;如:(M=3)B-树的特性:1.关键字集合分布在整颗树中;2.任何一个关键字出现且只出现在一个结点中;3.搜索有可能在非叶子结点结束;4.其搜索性能等价于在关键字全集内做一次二分查找;5.自动层次控制;B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点;B+Tree介绍B+树是B-树的变体,也是一种多路搜索树:1.其定义基本与B-树同,除了:2.非叶子结点的子树指针与关键字个数相同;3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);5.为所有叶子结点增加一个链指针;6.所有关键字都在叶子结点出现;如:(M=3)B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;B+的特性:1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;2.不可能在非叶子结点命中;3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;4.更适合文件索引系统;mysql中的索引MySQL中普遍使用B+Tree做索引,但在实现上又根据聚簇索引和非聚簇索引而不同。
聚集索引与非聚集索引
聚集索引与⾮聚集索引1、聚集索引定义:数据⾏的物理顺序与列值(⼀般是主键的那⼀列)的逻辑顺序相同,⼀个表中只能拥有⼀个聚集索引。
聚集索引对于那些经常要搜索范围值的列特别有效。
使⽤聚集索引找到包含第⼀个值的⾏后,便可以确保包含后续索引值的⾏在物理相邻。
例如,如果应⽤程序执⾏的⼀个查询经常检索某⼀⽇期范围内的记录,则使⽤聚集索引可以迅速找到包含开始⽇期的⾏,然后检索表中所有相邻的⾏,直到到达结束⽇期。
这样有助于提⾼此类查询的性能。
同样,如果对从表中检索的数据进⾏排序时经常要⽤到某⼀列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进⾏排序,从⽽节省成本。
当索引值唯⼀时,使⽤聚集索引查找特定的⾏也很有效率。
例如,使⽤唯⼀雇员 ID 列 emp_id 查找特定雇员的最快速的⽅法,是在emp_id 列上创建聚集索引或 PRIMARY KEY 约束。
2、⾮聚集索引 ⼀种索引,该索引中索引的逻辑顺序与磁盘上⾏的物理存储顺序不同。
索引是通过⼆叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。
⽽⾮聚簇索引的叶节点仍然是索引节点,只不过有⼀个指针指向对应的数据块。
注:除了聚集索引以外的索引都是⾮聚集索引,只是⼈们想细分⼀下⾮聚集索引,分成普通索引,唯⼀索引,全⽂索引。
如果⾮要把⾮聚集索引类⽐成现实⽣活中的东西,那么⾮聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不⼀定⼀致。
3、总结:(1)使⽤聚集索引的查询效率要⽐⾮聚集索引的效率要⾼,但是如果需要频繁去改变聚集索引的值,写⼊性能并不⾼,因为需要移动对应数据的物理位置。
(2)⾮聚集索引在查询的时候可以的话就避免⼆次查询,这样性能会⼤幅提升。
(3)不是所有的表都适合建⽴索引,只有数据量⼤表才适合建⽴索引,且建⽴在选择性⾼的列上⾯性能会更好。
数据库聚集索引和非聚集索引
数据库聚集索引和非聚集索引
数据库聚集索引和非聚集索引
1.什么是聚集索引
聚集索引(clustered index)是一种特殊的索引,它可以把数据表中的记录按照关键字排序,使得索引有序而连续。
一个数据表只能有一个聚集索引,也就是说,一个数据表只能有一种排序方式。
每次插入一条新的记录,都会建立一个新的索引,来保持整个索引的顺序。
查询时,聚集索引会把查询的结果以排好序的方式返回给客户端,从而提高查询效率。
2.什么是非聚集索引
非聚集索引(non-clustered index)是一种用来加速查询的数据库结构,它实际上是一个指向真实数据表的索引,提供了查询时可以快速定位真实数据表中记录的功能。
非聚集索引本身没有任何排序,而是按照索引的键,建立一种新的排列顺序,以便快速检索数据。
非聚集索引可以提高查询效率,但是其建立的额外空间开销比聚集索引要大。
3.聚集索引与非聚集索引的区别
(1)聚集索引实际上是表中的数据,而非聚集索引只是一个指向真实数据表的索引。
(2)聚集索引自身有序,而非聚集索引本身没有任何排序,但是按照索引的键可以快速检索数据。
(3)一个数据表只能有一个聚集索引,而一个数据表可以有多
个非聚集索引。
(4)聚集索引的建立需要消耗更多的空间,而非聚集索引的建立需要的空间更少。
聚集索引和非聚集索引的区别
聚集索引和非聚集索引的区别聚集索引和非聚集索引的区别聚集索引和非聚集索引的区别聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,聚集索引表记录的排列顺序与索引的排列顺序一致,优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后。
聚集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。
建议使用聚集索引的场合为:a.此列包含有限数目的不同值;b.查询的结果返回一个区间的值;c.查询的结果返回某值相同的大量结果集。
非聚集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致,聚集索引和非聚集索引都采用了B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。
非聚集索引比聚集索引层次多,添加记录不会引起数据顺序的重组。
建议使用非聚集索引的场合为:a.此列包含了大量数目不同的值;b.查询的结束返回的是少量的结果集;c.order by 子句中使用了该列。
--不用索引查询Select * FROM IndexTestTable WHIT(INDEX(0)) Where Status='B'--创建聚集索引Create CLUSTERED INDEX icIndexTestTable ON IndexTestTable(Status) GO--使用索引查询Select * FROM IndexTestTable WITH(INDEX(icIndexTestTable)) Where Status='B'。
聚集索引与非聚集索引的区别
聚集索引与非聚集索引的区别聚集索引(Clustered Index)和非聚集索引(Non-clustered Index)是数据库中两种不同类型的索引结构,它们在存储和组织数据上有一些显著的区别。
1. 定义:•聚集索引:聚集索引决定了数据表的物理顺序,表中的数据按照聚集索引的顺序存储在磁盘上。
每张表只能有一个聚集索引。
•非聚集索引:非聚集索引并不改变表中数据的物理存储顺序,而是在索引中存储指向实际数据行的指针。
一张表可以有多个非聚集索引。
2. 物理存储顺序:•聚集索引:表中的数据行按照聚集索引的顺序直接存储在磁盘上。
因此,聚集索引的构建会对表的物理存储结构产生影响。
•非聚集索引:表中的数据行的物理存储顺序与非聚集索引无关,数据行可能分散存储在磁盘上的不同位置。
3. 数据排序:•聚集索引:数据表按照聚集索引的顺序进行排序。
如果表按照聚集索引的某一列排序,那么这个索引就是聚集索引。
•非聚集索引:索引中的键值按照索引的顺序排序,但实际表中的数据行的排序不受索引的影响。
4. 查询性能:•聚集索引:由于数据行按照索引的顺序存储,某些范围查询、排序等操作可能更为高效。
但插入、更新等操作可能涉及到数据的移动,影响性能。
•非聚集索引:查询性能可能相对较好,因为索引的结构不会随着数据的变化而发生大的改变。
插入、更新等操作相对较快。
5. 主键约束:•聚集索引:如果表定义了主键,通常主键就是聚集索引。
•非聚集索引:如果表定义了主键,主键上的索引通常是非聚集索引。
总体来说,聚集索引和非聚集索引在数据的物理存储结构、排序方式和性能特点上存在显著的区别。
在选择索引类型时,需要根据具体的查询需求和数据修改频率进行权衡。
数据库索引设计面试题
数据库索引设计面试题
数据库索引设计是数据库管理的重要部分,以下是关于数据库索引设计的面试题:
1. 什么是索引?请简要描述索引的作用。
2. 哪些情况下应该建立索引?哪些情况下不应该建立索引?
3. 索引有哪些分类?请简要说明。
4. 什么是聚集索引和非聚集索引?它们有什么区别?
5. 请解释最左前缀原则。
6. 什么是回表查询?如何优化回表查询?
7. 什么是覆盖索引?它有什么优点?
8. 请解释索引的数据结构,如B+树和Hash索引。
9. B+树和B树有什么区别?为什么B+树更适合实现数据库索引?
10. 索引的优缺点是什么?如何平衡索引设计和数据库性能?
11. 请描述一个你曾经解决过的索引相关的问题,并说明你是如何解决的。
12. 在数据库设计中,你如何选择合适的索引类型和位置?
13. 如何监控和调优数据库索引性能?你有哪些常用的工具和技巧?
14. 在高并发环境下,如何保证数据库索引的正确性和性能?
15. 如果遇到索引失效的情况,你会如何排查和处理?
以上面试题可以帮助你了解应聘者对数据库索引设计的理解程度和实践经验。
除了这些问题,还可以根据具体的职位要求和公司需求进行深入探讨。
数据库聚集索引和非聚集索引
数据库聚集索引和非聚集索引数据库索引在数据库管理系统中扮演着至关重要的角色,它可以极大地提高数据的检索速度和查询效率。
在数据库中,主要有两种类型的索引——聚集索引和非聚集索引。
本文将分别介绍这两种索引的定义、特点和使用场景。
我们来看看聚集索引。
聚集索引是按照索引的键值对表中的行进行排序的一种索引。
换句话说,聚集索引实际上就是对整个表的重新排序。
在聚集索引中,数据行的物理顺序和索引的逻辑顺序是一致的。
这就意味着,表中的数据行实际上是按照聚集索引的键值排序的,这样大大提高了数据的检索速度。
聚集索引的一个明显优点是它可以减少磁盘I/O 操作的次数,因为数据行的物理顺序和索引的逻辑顺序是一致的,所以当查询时可以直接通过索引找到所需的数据行,而不需要进行额外的查找操作。
此外,聚集索引还可以加速范围查询的效率,因为相关的数据行通常都存储在一起,这样可以减少磁盘的读取次数。
不过,聚集索引也有一些缺点。
首先,当表中的数据行需要频繁更新时,由于数据行的物理顺序和索引的逻辑顺序是一致的,更新操作可能会导致数据页的分裂,从而增加了磁盘的I/O 操作。
其次,如果表中的数据行分布不均匀,可能会导致索引的频繁分裂,进而影响查询的性能。
接下来,我们来看看非聚集索引。
非聚集索引是一种独立于表的物理顺序的索引,数据行的物理顺序和索引的逻辑顺序是不一致的。
非聚集索引通常是在磁盘上单独存储的一种数据结构,它包含索引的键值和指向对应数据行的指针。
非聚集索引的一个明显优点是它不会影响数据行的物理存储顺序,因此在进行更新操作时,不会引起数据页的分裂,从而减少了磁盘的I/O 操作。
此外,非聚集索引还可以包含更多的列,从而提高了索引的覆盖度,减少了查询的成本。
然而,非聚集索引也存在一些缺点。
首先,由于数据行和索引的存储位置是分开的,因此在进行范围查询时可能需要进行额外的I/O 操作,降低了查询效率。
其次,非聚集索引通常需要占用更多的存储空间,因为它包含了额外的指针信息。
mysql实现原理
mysql实现原理MySQL是一种关系型数据库管理系统,它是由瑞典MySQL AB公司开发的,现在由Oracle公司维护和开发。
MySQL的实现原理主要包括数据存储、查询优化和事务处理三个方面。
数据存储是MySQL的核心功能之一,它采用了B+树索引结构来存储数据。
B+树是一种多路搜索树,它的每个节点可以存储多个关键字和指针,这样可以减少磁盘I/O操作,提高数据访问效率。
MySQL的B+树索引结构包括聚集索引和非聚集索引两种类型。
聚集索引是按照表的主键来构建的索引,它可以提高数据的访问速度,但是对于频繁更新的表来说,会导致性能下降。
非聚集索引是按照非主键列来构建的索引,它可以提高查询效率,但是对于频繁更新的表来说,会导致索引失效,需要重新构建索引。
查询优化是MySQL的另一个重要功能,它可以提高查询效率,减少查询时间。
MySQL的查询优化主要包括查询分析、查询重写和查询执行三个步骤。
查询分析是指对查询语句进行语法分析和语义分析,确定查询的执行计划。
查询重写是指对查询语句进行优化,包括去重、合并、排序等操作,以减少查询时间。
查询执行是指将查询语句转换为机器语言,执行查询操作,返回查询结果。
事务处理是MySQL的另一个重要功能,它可以保证数据的一致性和完整性。
MySQL的事务处理采用了ACID原则,即原子性、一致性、隔离性和持久性。
原子性是指事务中的所有操作要么全部执行成功,要么全部执行失败,不允许部分成功部分失败。
一致性是指事务执行前后,数据库的状态必须保持一致。
隔离性是指事务之间相互隔离,不会相互干扰。
持久性是指事务执行成功后,对数据库的修改必须永久保存。
MySQL的实现原理主要包括数据存储、查询优化和事务处理三个方面。
MySQL采用了B+树索引结构来存储数据,采用了查询优化来提高查询效率,采用了ACID原则来保证数据的一致性和完整性。
这些功能的实现,使得MySQL成为了一种高效、可靠的数据库管理系统。
SQL_聚集和非聚集索引
SQL Server 2008连载之存储结构——聚集索引聚集索引即基于数据行的键值在表内排序和存储这些数据行。
每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。
从某种程度上,聚集索引即数据,这句话是有道理的;但正如同其他索引一样,聚集索引也是按B 树结构进行组织的。
既然是B树组织,那么就有叶子结点和非叶子节点之分。
聚集索引B 树的顶端节点称为根节点;聚集索引中的底层节点称为叶节点。
在根节点与叶节点之间的任何索引级别统称为中间级。
在聚集索引中,叶节点包含基础表的数据页。
根节点和中间级节点包含存有索引行的索引页。
每个索引行包含一个键值和一个指针,该指针指向B 树上的某一中间级页或叶级索引中的某个数据行。
每级索引中的页均被链接在双向链接列表中。
因此可以这么说,聚集索引的叶子结点存储的是按聚集索引顺序排列的数据本身,而中间结点和根节点则在维护索引和其层级。
对于某个聚集索引,sys.system_internals_allocation_units中的root_page列指向该聚集索引某个特定分区的顶部。
SQL Server 将从索引中向下移动以查找与某个聚集索引键对应的行。
为了查找键的范围,SQL Server 将在索引中移动以查找该范围的起始键值,然后用向前或向后指针在数据页中进行扫描。
为了查找数据页链的首页,SQL Server 将从索引的根节点沿最左边的指针进行扫描。
name Type_descused_pagesdata_pagesfirst_page_addressroot_addressIAM_address testUniqueCluster IN_ROW_DATA 2 1 1:233 1:233 1:234 testNonUniqueCluster IN_ROW_DATA 2 1 1:235 1:235 1:236下面我们用dbcc命令介绍一下聚集索引的构造。
DBCC TRACEON(3604)DBCC PAGE(testDB,1,233,1)m_type = 15E3BC060: 1000d407 42202020 20202020 20202020 ?....B....5E3BC3E0: 20202020 20202020 42424231 20202020 ? BBB1...5E3BC830: 20202020 0200fc10 00d40741 20202020 ? .......A...5E3BCBB0: 20202020 20202020 20202020 20202041 ? A5E3BCBC0: 41413120 20202020 20202020 20202020 ?AA1...5E3BD000: 20202020 20202020 20202002 00fc0000 ? .....OFFSET TABLE:Row - Offset1 (0x1) - 96 (0x60)0 (0x0) - 2103 (0x837)DBCC PAGE(testDB,1,235,1)5E3BC060: 1000d407 42202020 20202020 20202020 ?....B...5E3BC3E0: 20202020 20202020 42424232 20202020 ? BBB2...5E3BC830: 20202020 0300f830 00d40742 20202020 ? ...0...B...5E3BCBB0: 20202020 20202020 20202020 20202042 ? B5E3BCBC0: 42423120 20202020 20202020 20202020 ?BB1...5E3BD000: 20202020 20202020 20202003 00f80100 ? .....5E3BD010: df070100 00001000 d4074120 20202020 ?..........A...5E3BD390: 20202020 20202020 20202020 20204141 ? AA5E3BD3A0: 41312020 20202020 20202020 20202020 ?A1...5E3BD7E0: 20202020 20202020 20200300 f8000021 ? .....!OFFSET TABLE:Row - Offset2 (0x2) - 2103 (0x837)1 (0x1) - 96 (0x60)0 (0x0) - 4118 (0x1016)其中红颜色的部分为每行的行头部分,蓝颜色部分为每行的结尾部分。
数据库的索引原理
数据库的索引原理
数据库的索引原理是一种数据结构,用于提高数据库的查询效率。
索引是一个按照特定规则组织的数据结构,它包含了表中某一列(或多列)的值和对应的物理存储位置。
通过索引,数据库可以快速定位到所需的数据,而不需要遍历整个数据表。
索引主要有以下几个原理:
1. B-树索引:常用的索引类型之一,使用B-树来存储索引值。
B-树是一种多叉平衡查找树,它的叶子节点存储了数据行的引用或数据本身。
通过B-树索引,数据库可以快速定位到匹配的记录,减少磁盘I/O次数。
2. 哈希索引:哈希索引是将索引键值通过哈希函数计算后得到一个哈希码,然后将该哈希码与数据行的物理存储位置进行映射。
哈希索引适用于等值查找,但不适用于范围查询。
3. 聚集索引和非聚集索引:聚集索引是按照表的主键或唯一键来组织数据的索引,数据存储在索引的叶子节点上。
非聚集索引则是在叶子节点上存储索引键值和指向数据行的物理地址。
4. 复合索引:复合索引是通过多列联合创建的索引,可以在查询中同时使用多个列进行查找。
复合索引可以提高符合索引列顺序的查询效率。
5. 全文索引:全文索引用于对文本数据进行全文搜索。
全文索引不只是单一关键字的匹配,而是将文本数据进行分词、分析和索引,从而提供更快速和准确的搜索结果。
总的来说,索引的原理是为了提高数据库的查询效率,减少磁盘I/O次数,并根据不同的查询需求选择合适的索引类型和策略。
mysql的索引的实现原理
mysql的索引的实现原理MySQL的索引实现原理主要包括以下几个步骤:1. B-Tree索引:MySQL主要使用B-Tree(平衡树)结构来实现索引。
B-Tree是一种自平衡的树,能够保证在插入、删除和查找操作中保持树的平衡,从而提供高效的查询性能。
在MySQL中,InnoDB存储引擎使用B+Tree作为索引结构。
2. 聚集索引和非聚集索引:InnoDB存储引擎支持聚集索引(clustered index)和非聚集索引(non-clustered index)。
聚集索引是指主键索引,它将数据记录按照主键的顺序物理存储,这样可以直接通过主键访问数据。
非聚集索引则通过索引记录指向数据记录,通常以B-Tree结构存储。
3. 空间优化:除了基本的B-Tree结构外,InnoDB还使用了前缀压缩、空间填充函数等方法来减少索引所占用的空间,从而提高索引的存储效率。
4. 多列索引:MySQL也支持多列索引,即一个索引包含多个列。
这种索引可以加快多列查询的速度,但也会增加索引的大小和维护成本。
5. 哈希索引:MySQL还支持哈希索引,主要在MEMORY存储引擎中使用。
哈希索引通过计算哈希值来快速查找数据,但在处理范围查询时效率较低。
6. 全文索引:从MySQL 版本开始,MySQL还支持全文索引(FULLTEXT index),主要用于在文本字段上执行全文搜索。
7. 缓存:为了提高性能,MySQL会缓存常用索引,当执行相同的查询时可以直接从缓存中获取结果,避免了再次进行索引查找。
总之,MySQL的索引实现原理主要基于B-Tree结构,并使用各种优化技术来提高查询性能。
同时,根据不同的存储引擎和数据类型,MySQL还支持多种不同类型的索引。
【转】 索引机制索引技术索引设计准则
【转】索引机制、索引技术、索引设计准则索引机制、索引技术、索引设计准则转自/wq3if2in/archive/2009/04/02/1428 068.html1.横向比较数据库中不同的索引机制一、引言对数据库索引的关注从未淡出我的们的讨论,那么数据库索引是什么样的?聚集索引与非聚集索引有什么不同?希望本文对各位同仁有一定的帮助。
有不少存疑的地方,诚心希望各位不吝赐教指正,共同进步。
二、B-Tree我们常见的数据库系统,其索引使用的数据结构多是B-Tree 或者B+Tree。
例如,MsSql使用的是B+Tree,Oracle及Sysbase使用的是B-Tree。
所以在最开始,简单地介绍一下B-Tree。
B-Tree不同于Binary Tree(二叉树,最多有两个子树),一棵M阶的B-Tree满足以下条件:1)每个结点至多有M个孩子;2)除根结点和叶结点外,其它每个结点至少有M/2个孩子;3)根结点至少有两个孩子(除非该树仅包含一个结点);4)所有叶结点在同一层,叶结点不包含任何关键字信息;5)有K个关键字的非叶结点恰好包含K+1个孩子;另外,对于一个结点,其内部的关键字是从小到大排序的。
以下是B-Tree(M=4)的样例:对于每个结点,主要包含一个关键字数组Key[],一个指针数组(指向儿子)Son[]。
在B-Tree内,查找的流程是:使用顺序查找(数组长度较短时)或折半查找方法查找Key[]数组,若找到关键字K,则返回该结点的地址及K在Key[]中的位置;否则,可确定K在某个Key[i]和Key[i+1]之间,则从Son[i]所指的子结点继续查找,直到在某结点中查找成功;或直至找到叶结点且叶结点中的查找仍不成功时,查找过程失败。
接着,我们使用以下图片演示如何生成B-Tree(M=4,依次插入1~6):从图可见,当我们插入关键字4时,由于原结点已经满了,故进行分裂,基本按一半的原则进行分裂,然后取出中间的关键字2,升级(这里是成为根结点)。
聚集索引和非聚集索引和聚簇索引和非聚簇索引的关系
聚集索引和非聚集索引和聚簇索引和非聚簇索引的关系想象一下,你有一个大箱子,里面装满了各种各样的东西。
有衣服、鞋子、书籍、玩具,甚至还有你不太想看见的那一堆乱七八糟的旧东西。
如果你需要找到某个特定的物品,怎么办呢?你是不是会想,最好能有个清单,或者是把这些东西按种类分一下?说得简单点,那个“清单”就是索引,能帮助你快速找到你想要的东西。
最巧妙的是,这个“清单”有很多种不同的方式,不同的方式适合不同的情况。
比如,在数据库里,我们就常常听到“聚集索引”和“非聚集索引”这两种说法,它们分别有自己的一套规则,帮助我们更快、更方便地查找数据。
咱们来说说“聚集索引”。
这个名字听起来是不是很高大上?其实呢,它就像是你把所有的衣服都按颜色和大小整整齐齐地放好,然后给每一类衣服都写上标签,放在一个巨大的柜子里。
你知道,每当你需要一件衣服时,只要根据标签就能迅速找到。
聚集索引的“柜子”可不是随便的哦,它决定了你放东西的顺序。
如果你决定把衣服按大小排好,那么所有的衣服就会按照这个顺序紧密地排在一起,没有一丝空隙。
如果你能明白这个意思,那么你就能理解聚集索引的精髓了。
它会按某种顺序(通常是主键)把数据存放在磁盘上,像排队一样,不可改变顺序。
如果你想插入新的数据,它可能得调整其他数据的位置,就像你重新排队一样,费劲又麻烦,但如果数据是有序的,查找起来那是相当迅速。
但问题来了,什么是“非聚集索引”呢?这就好比你家里有一堆散乱的书,你又不想把它们按照某种顺序摆放。
可是,你心里还是有个“清单”,知道每本书的大概位置。
这样,你每次想找书时,虽然不按顺序摆放,可是你能迅速找到这本书的大概位置,然后就能走到那个位置去翻找。
这就是非聚集索引的工作方式。
它并不改变数据的顺序,而是为数据提供了一个独立的索引,指向数据存储的地址。
它更灵活、方便,尤其是在你有大量不同种类数据时。
简单来说,非聚集索引就像是一个帮助你找路的导航,但你自己的路还是得自己走。
Mysql聚簇索引和非聚簇索引
Mysql聚簇索引和非聚簇索引在mysql数据库中,myisam引擎和innodb引擎使用的索引类型不同,myisam对应的是非聚簇索引,而innodb对应的是聚簇索引。
聚簇索引也叫复合索引、聚集索引等等。
聚簇索引:“聚簇”的意思是数据行被按照一定顺序一个个紧密地排列在一起存储。
一个表只能有一个聚簇索引,因为在一个表中数据的存放方式只有一种。
非聚簇索引:又叫二级索引。
二级索引的叶子节点中保存的不是指向行的物理指针,而是行的主键值。
当通过二级索引查找行,存储引擎需要在二级索引中找到相应的叶子节点,获得行的主键值,然后使用主键去聚簇索引中查找数据行,这需要两次B-Tree查找。
非聚簇索引以myisam为例,一个数据表table中,它是有table.frm、table.myd以及table.myi组成。
table.myd记录了数据,table.myi记录了索引的数据。
在用到索引时,先到table.myi(索引树)中进行查找,取到数据所在table.myd 的行位置,拿到数据。
所以myisam引擎的索引文件和数据文件是独立分开的,则称之为非聚簇索引。
myisam类型的索引,指向数据在行的位置。
即每个索引相对独立,查询用到索引时,索引指向数据的位置。
聚簇索引以innodb为例,在一个数据table中,它的数据文件和索引文件是同一个文件。
即在查询过程中,找到了索引,便找到了数据文件。
在innodb中,即存储主键索引值,又存储行数据,称之为聚簇索引。
innodb索引,指向主键对数据的引用。
非主键索引则指向对主键的引用。
innodb中,没有主见索引,则会使用unique索引,没有unique索引,则会使用数据库内部的一个行的id来当作主键索引。
在聚簇索引中,数据会被按照顺序整理排列,当使用where进行顺序、范围、大小检索时,会大大加速检索效率。
非聚簇索引在存储时不会对数据进行排序,相对产生的数据文件体积也比较大。
聚集索引和非聚集索引区别
聚集索引和⾮聚集索引区别(1)聚集索引:表中存储的数据按照索引的顺序存储,检索效率⽐普通索引⾼,但对数据新增/修改/删除的影响⽐较⼤特点: (1) ⼀个表可以最多可以创建249个索引 (2) 先建聚集索引才能创建⾮聚集索引(3) ⾮聚集索引数据与索引不同序(4) 数据与索引在不同位置(5) 索引在叶节点上存储,在叶节点上有⼀个"指针"直接指向要查询的数据区域(6) 数据不会根据索引键的顺序重新排列数据创建聚集索引的语法:create CLUSTERED INDEX idximpID ON EMP(empID)(2)⾮聚集索引:不影响表中的数据存储顺序,检索效率⽐聚集索引低,对数据新增/修改/删除的影响很少特点:(1) ⽆索引,数据⽆序(2) 有索引,数据与索引同序(3) 数据会根据索引键的顺序重新排列数据(4) ⼀个表只能有⼀个索引(5) 叶节点的指针指向的数据也在同⼀位置存储语法:create NONCLUSTERED INDEX idxempID on emp(empID)(3)惟⼀索引:惟⼀索引可以确保索引列不包含重复的值.可以⽤多个列,但是索引可以确保索引列中每个值组合都是唯⼀的姓名李⼆张三王五语法: create unique index idxempid on emp(姓,名)(4)复合索引:如果在两上以上的列上创建⼀个索引,则称为复合索引。
那么,不可能有两⾏的姓和名是重复的语法:create index indxfullname on addressbook(firstname,lastname)(5)系统⾃建的索引:在使⽤T_sql语句创建表的时候使⽤PRIMARY KEY或UNIQUE约束时,会在表上⾃动创建⼀个惟⼀索引⾃动创建的索引是⽆法删除的语法:create table ABc( empID int primary key,firstname varchar(50)UNIQUE,lastname varchar(50)UNIQUE,)这样的结果就出来了三个索引,但只有⼀个聚集索引哦。
浅谈数据库聚集索引和非聚集索引
浅谈数据库聚集索引和⾮聚集索引聚集索引和⾮聚集索引的理解实际上,您可以把索引理解为⼀种特殊的⽬录。
微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和⾮聚集索引(nonclustered index,也称⾮聚类索引、⾮簇集索引)。
下⾯,我们举例来说明⼀下聚集索引和⾮聚集索引的区别:其实,我们的汉语字典的正⽂本⾝就是⼀个聚集索引。
⽐如,我们要查“安”字,就会很⾃然地翻开字典的前⼏页,因为“安”的拼⾳是“an”,⽽按照拼⾳排序汉字的字典是以英⽂字母“a”开头并以“z”结尾的,那么“安”字就⾃然地排在字典的前部。
如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼⾳是“zhang”。
也就是说,字典的正⽂部分本⾝就是⼀个⽬录,您不需要再去查其他⽬录来找到您需要找的内容。
我们把这种正⽂内容本⾝就是⼀种按照⼀定规则排列的⽬录称为“聚集索引”。
如果您认识某个字,您可以快速地从⾃动中查到这个字。
但您也可能会遇到您不认识的字,不知道它的发⾳,这时候,您就不能按照刚才的⽅法找到您要查的字,⽽需要去根据“偏旁部⾸”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。
但您结合“部⾸⽬录”和“检字表”⽽查到的字的排序并不是真正的正⽂的排序⽅法,⽐如您查“张”字,我们可以看到在查部⾸之后的检字表中“张”的页码是672页,检字表中“张”的上⾯是“驰”字,但页码却是63页,“张”的下⾯是“弩”字,页⾯是390页。
很显然,这些字并不是真正的分别位于“张”字的上下⽅,现在您看到的连续的“驰、张、弩”三字实际上就是他们在⾮聚集索引中的排序,是字典正⽂中的字在⾮聚集索引中的映射。
我们可以通过这种⽅式来找到您所需要的字,但它需要两个过程,先找到⽬录中的结果,然后再翻到您所需要的页码。
聚集索引和非聚集索引
聚集索引的区别聚集索引:物理存储按照索引排序非聚集索引:物理存储不按照索引排序优势与缺点聚集索引:插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快聚集索引的区别聚集索引:物理存储按照索引排序非聚集索引:物理存储不按照索引排序优势与缺点聚集索引:插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。
而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。
如下图:非聚集索引聚集索引一、索引块与数据块的区别大家都知道,索引可以提高检索效率,因为它的二叉树结构以及占用空间小,所以访问速度块。
让我们来算一道数学题:如果表中的一条记录在磁盘上占用1000字节的话,我们对其中10字节的一个字段建立索引,那么该记录对应的索引块的大小只有10字节。
我们知道,SQL Server的最小空间分配单元是“页(Page)”,一个页在磁盘上占用8K空间,那么这一个页可以存储上述记录8条,但可以存储索引800条。
现在我们要从一个有8000条记录的表中检索符合某个条件的记录,如果没有索引的话,我们可能需要遍历8000条×1000字节/8K 字节=1000个页面才能够找到结果。
如果在检索字段上有上述索引的话,那么我们可以在8000条×10字节/8K字节=10个页面中就检索到满足条件的索引块,然后根据索引块上的指针逐一找到结果数据块,这样IO访问量要少的多。
二、索引优化技术是不是有索引就一定检索的快呢?答案是否。
有些时候用索引还不如不用索引快。
比如说我们要检索上述表中的所有记录,如果不用索引,需要访问8000条×1000 字节/8K字节=1000个页面,如果使用索引的话,首先检索索引,访问8000条×10字节/8K字节=10个页面得到索引检索结果,再根据索引检索结果去对应数据页面,由于是检索所有数据,所以需要再访问8000条×1000字节/8K字节=1000个页面将全部数据读取出来,一共访问了1010个页面,这显然不如不用索引快。
聚集索引、非聚集索引、Hash索引的区别和各自的优劣
谈谈聚集索引、非聚集索引、Hash索引的区别和各自的优劣,Include覆盖索引的作用,相对于组合索引的优势;
一个表可以有一个聚集索引,多个非聚集索引
聚集索引和非聚集索引都是以B树结构来存储的,非叶子节点存储索引信息,不同的是,聚集索引的B树结构中,叶子节点直接存储数据,
当表上创建了聚集索引时,数据在物理上以已聚集索引顺序存储,对于物理上不连续的存储单元page或者extend,称之为碎片(freagment)
由于数据是聚集键为顺序物理存储的,
当聚集索引键选择不当时,在插入数据时,可能发生页拆分,造成插入数据开销较大,频繁的页拆分,会造成磁盘空间利用率不高
非聚集索引叶子节点存储的是RID或者是聚集索引的键值,以非聚集索引查询时,通过叶子节点的RID或者聚集索引键值找到该数据信息
include索引的存在,查找覆盖索引包含的键值的时候,可以直接在索引页上查询到数据信息,避免了书签查找(bookmark looku)
include索引覆盖的列存储在非聚集索引的叶子节点,相对于组合索引,既可以避免书签查找,同时减少B树结构中索引的宽度。
聚集索引与非聚集索引
聚集索引与⾮聚集索引 聚集索引与⾮聚集索引的区别:聚集索引⼀个表只能有⼀个,⽽⾮聚集索引⼀个表可以存在多个。
聚集索引的叶节点就是最终的数据节点,⽽⾮聚集索引的叶节仍然是索引节点,但它有⼀个指向最终数据的指针。
使⽤聚集索引来做查询操作时速度很快,但是做插⼊操作时就较为费时。
InnoDB⽀持聚集索引,MyISAM不⽀持聚集索引。
InnoDB按照主键进⾏聚集,如果没有定义主键,InnoDB会试着使⽤唯⼀的⾮空索引来代替。
如果没有这种索引,InnoDB就会定义隐藏的主键然后在上⾯进⾏聚集。
MySQL中如果定义了主键,那么聚集索引就是主键。
MySQL的索引分为B+树索引和hash索引与全⽂索引。
MyISAM数据库引擎和InnoDB数据库引擎的索引都是基于B+树的。
MyISAM是不⽀持聚集索引的,所以MyISAM中的索引的存储格式如下所⽰,都是在叶⼦节点中存储着数据所对应的指针。
InnoDB是不⽀持聚集索引的,所以InnoDB中的索引的存储格式如下所⽰,主键的存储⽅式和⾮主键的存储⽅式是不同的。
关于索引的使⽤与优化有下⾯的⼀些准则:当在建⽴了索引的列上使⽤精确匹配,使⽤“=”或者“in”时是会使⽤索引的。
最左匹配原则,在a和b上建⽴了联合索引,where b = ?时是不会使⽤告警的。
通配符%不能放在开头,也就是说,like %abc%是不会使⽤索引的,like abc%是会使⽤索引的。
范围列(>,<,between and)可以⽤到索引,但是范围列后⾯的列⽆法⽤到索引。
同时,索引最多⽤于⼀个范围列,因此如果查询条件中有两个范围列则⽆法全⽤到索引。
如果使⽤了函数或者表达式,则不会使⽤索引。
例如,left(title, 6)='Senior'将不会使⽤到索引,可以使⽤like代替。
group by的优化需要松散索引扫描和紧凑索引扫描,单独地进⾏说明。
关于索引的建⽴,还有下⾯⼀些需要注意的地⽅:索引要建⽴在数值分布均匀的列上,如果在性别,只有男和⼥2个取值的列上建⽴索引,对于查询速度的提升不会有很⼤帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅谈B-树以及数据库聚集索引、非聚集索引对数据库索引的关注从未淡出我的们的讨论,那么数据库索引是什么样的?聚集索引与非聚集索引有什么不同?这段时间,了解数据库索引的一些相关知识,又查阅了一些相关资料,希望本文对大家有一定的帮助,在此借此机会与大家分享一些数据库聚集索引、数据库非聚集索引概念、实现过程、以及优缺点。
有不少存疑的地方,诚心希望各位不吝赐教指正,共同进步。
我们常见的数据库系统,其索引使用的数据结构多是B-Tree或者B+Tree。
例如,MySql使用的是B+Tree,Oracle及Sysbase使用的是B-Tree。
所以在最开始,简单地介绍一下B-Tree。
1.B-Tree在严蔚敏编著的《数据结构》种对B-Tree有如下定义:B-Tree是一种平衡的多路查找树,它在文件系统中很有用,一棵m阶的B-树,或为空树,或为满足下列特性的m叉树:1)树中每个结点至多有m个孩子;2)若根节点不是叶子节点,则至少有两棵子树;3)除根结点和叶结点外,其它每个结点至少有m/2(上取整)个孩子;4)所有叶结点在同一层,叶结点不包含任何关键字信息;5)有K个关键字的非叶结点恰好包含K+1个孩子另外,对于一个结点,其内部的关键字是从小到大排序的。
以下是B-Tree (m=4)的样例:对于每个结点,主要包含一个关键字数组key[],一个指针数组(指向儿子)son[]。
在B-Tree内,查找的流程是:使用顺序查找(数组长度较短时)或折半查找方法查找key[]数组,若找到关键字k,则返回该结点的地址及K在key[]中的位置;否则,可确定k在某个key[i]和key[i+1]之间,则从son[i]所指的子结点继续查找,直到在某结点中查找成功;或直至找到叶结点且叶结点中的查找仍不成功时,查找过程失败。
接着,我们使用以下图片演示如何生成B-Tree(m=4,依次插入1~6):从图可见,当我们插入关键字4时,由于原结点已经满了,故进行分裂,基本按一半的原则进行分裂,然后取出中间的关键字2,升级(这里是成为根结点)。
其它的依类推,就是这样一个大概的过程。
2.数据库索引1.什么是索引在数据库中,索引的含义与日常意义上的“索引”一词并无多大区别(想想小时候查字典),它是用于提高数据库表数据访问速度的数据库对象。
A)索引可以避免全表搜索。
多数查询可以仅扫描少量索引页及数据页,而不是遍历所有数据页。
B)对于非聚集索引,有些查询甚至可以不访问数据页。
C)聚集索引可以避免数据插入操作集中于表的最后一个数据页。
D)一些情况下,索引还可用于避免排序操作。
当然,众所周知,虽然索引可以提高查询速度,但是它们也会导致数据库系统更新数据的性能下降,因为大部分数据更新需要同时更新索引。
2.索引的存储一条索引记录中包含的基本信息包括:键值(即你定义索引时指定的所有字段的值)+逻辑指针(指向数据页或者另一索引页)。
当你为一张空表创建索引时,数据库系统将为你分配一个索引页,该索引页在你插入数据前一直是空的。
此页此时既是根结点,也是叶结点。
每当你往表中插入一行数据,数据库系统即向此根结点中插入一行索引记录。
当根结点满时,数据库系统大抵按以下步骤进行分裂:A)创建两个儿子结点B)将原根结点中的数据近似地拆成两半,分别写入新的两个儿子结点C)根结点中加上指向两个儿子结点的指针通常状况下,由于索引记录仅包含索引字段值(以及4-9字节的指针),索引实体比真实的数据行要小许多,索引页相较数据页来说要密集许多。
一个索引页可以存储数量更多的索引记录,这意味着在索引中查找时在I/O上占很大的优势,理解这一点有助于从本质上了解使用索引的优势。
3.聚集索引聚集索引,表数据按照索引的顺序来存储的。
对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。
在一张表上只能创建一个聚集索引,因为真实数据的物理顺序只可能是一种。
如果一张表没有聚集索引,那么它被称为“堆集”(Heap)。
这样的表中的数据行没有特定的顺序,所有的新行将被添加的表的末尾位置。
在聚集索引中,叶结点也即数据结点,所有数据行的存储顺序与索引的存储顺序一致。
1)聚集索引与查询操作如上图,我们在名字字段上建立聚集索引,当需要在根据此字段查找特定的记录时,数据库系统会根据特定的系统表查找的此索引的根,然后根据指针查找下一个,直到找到。
例如我们要查询“Green”,由于它介于[Bennet,Karsen],据此我们找到了索引页1007,在该页中“Green”介于[Greane, Hunter]间,据此我们找到叶结点1133(也即数据结点),并最终在此页中找以了目标数据行。
此次查询的IO包括3个索引页的查询(其中最后一次实际上是在数据页中查询)。
这里的查找可能是从磁盘读取或是从缓存中读取),如果此表访问频率较高,那么索引树中较高层的索引很可能在缓存中被找到。
所以真正的IO可能小于上面的情况。
2)聚集索引与插入操作最简单的情况下,插入操作根据索引找到对应的数据页,然后通过挪动已有的记录为新数据腾出空间,最后插入数据。
如果数据页已满,则需要拆分数据页(页拆分是一种耗费资源的操作,一般数据库系统中会有相应的机制要尽量减少页拆分的次数,通常是通过为每页预留空间来实现):A)在该使用的数据段上分配新的数据页,如果数据段已满,则需要分配新段。
B)调整索引指针,这需要将相应的索引页读入内存并加锁。
C)大约有一半的数据行被归入新的数据页中。
D)如果表还有非聚集索引,则需要更新这些索引指向新的数据页。
特殊情况:A)如果新插入的一条记录包含很大的数据,可能会分配两个新数据页,其中之一用来存储新记录,另一存储从原页中拆分出来的数据。
B)通常数据库系统中会将重复的数据记录存储于相同的页中。
C)类似于自增列为聚集索引的,数据库系统可能并不拆分数据页,页只是简单的新添数据页。
3)聚集索引与删除操作删除行将导致其下方的数据行向上移动以填充删除记录造成的空白。
如果删除的行是该数据页中的最后一行,那么该数据页将被回收,相应的索引页中的记录将被删除。
如果回收的数据页位于跟该表的其它数据页相同的段上,那么它可能在随后的时间内被利用。
如果该数据页是该段的唯一一个数据页,则该段也被回收。
对于数据的删除操作,可能导致索引页中仅有一条记录,这时,该记录可能会被移至邻近的索引页中,原索引页将被回收,即所谓的“索引合并”。
4.非聚集索引非聚集索引,表数据存储顺序与索引顺序无关。
对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,该层紧邻数据页,其行数量与数据表行数据量一致。
非聚集索引与聚集索引相比:A)叶子结点并非数据结点B)叶子结点为每一真正的数据行存储一个“键-指针”对C)叶子结点中还存储了一个指针偏移量,根据页指针及指针偏移量可以定位到具体的数据行。
D)类似的,在除叶结点外的其它索引结点,存储的也是类似的内容,只不过它是指向下一级的索引页的。
聚集索引是一种稀疏索引,数据页上一级的索引页存储的是页指针,而不是行指针。
而对于非聚集索引,则是密集索引,在数据页的上一级索引页它为每一个数据行存储一条索引记录。
对于根与中间级的索引记录,它的结构包括:A)索引字段值B)RowId(即对应数据页的页指针+指针偏移量)。
在高层的索引页中包含RowId是为了当索引允许重复值时,当更改数据时精确定位数据行。
C)下一级索引页的指针对于叶子层的索引对象,它的结构包括:A)索引字段值B)RowId1)非聚集索引与查询操作针对上图,如果我们同样查找“Green”,那么一次查询操作将包含以下IO:3个索引页的读取+1个数据页的读取。
同样,由于缓存的关系,真实的IO实际可能要小于上面列出的。
2)非聚集索引与插入操作如果一张表包含一个非聚集索引但没有聚集索引,则新的数据将被插入到最末一个数据页中,然后非聚集索引将被更新。
如果也包含聚集索引,该聚集索引将被用于查找新行将要处于什么位置,随后,聚集索引、以及非聚集索引将被更新。
3)非聚集索引与删除操作如果在删除命令的Where子句中包含的列上,建有非聚集索引,那么该非聚集索引将被用于查找数据行的位置,数据删除之后,位于索引叶子上的对应记录也将被删除。
如果该表上有其它非聚集索引,则它们叶子结点上的相应数据也要删除。
如果删除的数据是该数所页中的唯一条,则该页也被回收,同时需要更新各个索引树上的指针。
由于没有自动的合并功能,如果应用程序中有频繁的随机删除操作,最后可能导致表包含多个数据页,但每个页中只有少量数据。
5.索引覆盖索引覆盖是这样一种索引策略:当某一查询中包含的所需字段皆包含于一个索引中,此时索引将大大提高查询性能。
包含多个字段的索引,称为复合索引。
索引最多可以包含31个字段,索引记录最大长度为600B。
如果你在若干个字段上创建了一个复合的非聚集索引,且你的查询中所需Select字段及Where,Order By,Group By,Having子句中所涉及的字段都包含在索引中,则只搜索索引页即可满足查询,而不需要访问数据页。
由于非聚集索引的叶结点包含所有数据行中的索引列值,使用这些结点即可返回真正的数据,这种情况称之为“索引覆盖”。
在索引覆盖的情况下,包含两种索引扫描:1)匹配索引扫描此类索引扫描可以让我们省去访问数据页的步骤,当查询仅返回一行数据时,性能提高是有限的,但在范围查询的情况下,性能提高将随结果集数量的增长而增长。
针对此类扫描,索引必须包含查询中涉及的的所有字段,另外,还需要满足:Where子句中包含索引中的“引导列”(Leading Column),例如一个复合索引包含A,B,C,D四列,则A为“引导列”。
如果Where子句中所包含列是BCD 或者BD等情况,则只能使用非匹配索引扫描。
2)非配置索引扫描正如上述,如果Where子句中不包含索引的导引列,那么将使用非配置索引扫描。
这最终导致扫描索引树上的所有叶子结点,当然,它的性能通常仍强于扫描所有的数据页。