聚簇索引与非聚簇索引的区别
来源:互联网 发布:php 敏感词过滤 编辑:程序博客网 时间:2024/04/30 03:29
聚簇索引与非聚簇索引的区别
通常情况下,建立索引是加快查询速度的有效手段。但索引不是万能的,靠索引并不能实现对所有
数据的快速存取。事实上,如果索引策略和数据检索需求严重不符的话,建立索引反而会降低查询性能
。因此在实际使用当中,应该充分考虑到索引的开销,包括磁盘空间的开销及处理开销(如资源竞争和
加锁)。例如,如果数据频繁的更新或删加,就不宜建立索引。
本文简要讨论一下聚簇索引的特点及其与非聚簇索引的区别。
建立索引:
在SQL语言中,建立聚簇索引使用CREATE INDEX语句,格式为:CREATE CLUSTER INDEX index_name ON
table_name(column_name1,column_name2,...);
存储特点:
聚集索引。表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于
聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个
聚集索引,因为真实数据的物理顺序只能有一种。
非聚集索引。表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页
数据行的逻辑指针,其行数量与数据表行数据量一致。
总结一下:聚集索引是一种稀疏索引,数据页上一级的索引页存储的是页指针,而不是行指针。而
对于非聚集索引,则是密集索引,在数据页的上一级索引页它为每一个数据行存储一条索引记录。
更新表数据
1、向表中插入新数据行
如果一张表没有聚集索引,那么它被称为“堆集”(Heap)。这样的表中的数据行没有特定的顺序
,所有的新行将被添加到表的末尾位置。而建立了聚簇索引的数据表则不同:最简单的情况下,插入操
作根据索引找到对应的数据页,然后通过挪动已有的记录为新数据腾出空间,最后插入数据。如果数据
页已满,则需要拆分数据页,调整索引指针(且如果表还有非聚集索引,还需要更新这些索引指向新的
数据页)。而类似于自增列为聚集索引的,数据库系统可能并不拆分数据页,而只是简单的新添数据页
。
2、从表中删除数据行
对删除数据行来说:删除行将导致其下方的数据行向上移动以填充删除记录造成的空白。如果删除
的行是该数据页中的最后一行,那么该数据页将被回收,相应的索引页中的记录将被删除。对于数据的
删除操作,可能导致索引页中仅有一条记录,这时,该记录可能会被移至邻近的索引页中,原索引页将
被回收,即所谓的“索引合并”。
========
数据库中聚簇索引与非聚簇索引的区别
在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索
引的解释是:索引顺序与数据物理排列顺序无关。正式因为如此,所以一个表最多只能有一个聚簇索引
在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索
引的解释是:索引顺序与数据物理排列顺序无关。正式因为如此,所以一个表最多只能有一个聚簇索引。
不过这个定义太抽象了。在SQL Server中,索引是通过二叉树的数据结构来描述的,我们可以这么理解
聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指
向对应的数据块。如下图:
非聚簇索引
聚簇索引
聚簇索引与非聚簇索引的本质区别到底是什么?什么时候用聚簇索引,什么时候用非聚簇索引?
这是一个很复杂的问题,很难用三言两语说清楚。我在这里从SQL Server索引优化查询的角度简单谈谈(
如果对这方面感兴趣的话,可以读一读微软出版的《Microsoft SQL Server 2000数据库编程》第3单元
的数据结构引论以及第6、13、14单元)。
阅读全文
0 0
- MySQL索引:聚簇索引与非聚簇索引的区别
- MySQL索引:聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的语义区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 聚簇索引与非聚簇索引的区别
- 【Unity】【UI.Text】【Code】通用代码库(五)——文字循环滚动+touch控制上下滚动
- 非阻塞式socket的select()用法
- mysql操作查询结果case when then else end用法举例
- post提交json数据后,java接收json
- 北大oj-1008 C语言
- 聚簇索引与非聚簇索引的区别
- 数学建模_使用excel对字符串进行截取并简单计数
- 分页
- 【汇总】8月下半月上海热门IT互联网科技大会合集
- 矩阵的满秩分解
- 腾讯TMQ团队10年巨献-iOS测试实践
- javascript写简单的省市级联
- python 胡乱小结
- JAVA8-LAMBDA中reduce的用法