聚簇索引 非聚簇索引

http://blog.sina.com.cn/s/blog_6caea8bf0100z9wz.html

通常情况下,建立索引是加快查询速度的有效手段。但索引不是万能的,靠索引并不能实现对所有数据的快速存取。事实上,如果索引策略和数据检索需求严重不符的话,建立索引反而会降低查询性能。因此在实际使用当中,应该充分考虑到索引的开销,包括磁盘空间的开销及处理开销 (如资源竞争和加锁) 。例如,如果数据频繁的更新或删加,就不宜建立索引。

  本文简要讨论一下聚簇索引的特点及其与非聚簇索引的区别。

建立索引:

在SQL语言中,建立聚簇索引使用CREATE INDEX语句,格式为: CREATE CLUSTER INDEX index_name ON table_name(column_name1,column_name2,…);

存储特点:

聚集索引。表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个聚集索引,因为真实数据的物理顺序只能有一种。

非聚集索引。表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致。

总结一下: 聚集索引是一种稀疏索引,数据页上一级的索引页存储的是页指针,而不是行指针。而对于非聚集索引,则是密集索引,在数据页的上一级索引页它为每一个数据行存储一条索引记录。

更新表数据

1、向表中插入新数据行 如果一张表没有聚集索引,那么它被称为"堆集” (Heap) 。这样的表中的数据行没有特定的顺序,所有的新行将被添加到表的末尾位置。而建立了聚簇索引的数据表则不同: 最简单的情况下,插入操作根据索引找到对应的数据页,然后通过挪动已有的记录为新数据腾出空间,最后插入数据。如果数据页已满,则需要拆分数据页,调整索引指针 (且如果表还有非聚集索引,还需要更新这些索引指向新的数据页) 。而类似于自增列为聚集索引的,数据库系统可能并不拆分数据页,而只是简单的新添数据页。

2、从表中删除数据行

对删除数据行来说: 删除行将导致其下方的数据行向上移动以填充删除记录造成的空白。如果删除的行是该数据页中的最后一行,那么该数据页将被回收,相应的索引页中的记录将被删除。对于数据的删除操作,可能导致索引页中仅有一条记录,这时,该记录可能会被移至邻近的索引页中,原索引页将被回收,即所谓的"索引合并”。

稀疏索引

稀疏索引只为数据文件的每个存储块设一个键-指针对,它比稠密索引节省了更多的存储空间,但查找给定值的记录需更多的时间。只有当数据文件是按照某个查找键排序时,在该查找键上建立的稀疏索引才能被使用,而稠密索引则可以应用在任何的查找键。如图3-3所示,稀疏索引只为每个存储块设一个键-指针对。键值是每个数据块中第一个记录的对应值。

例3.3同例3.2一样,我们假定数据文件已排序,且其键值为连续的10的倍数,直至某个较大的数。我们还继续假定每个存储块可存放四个键-指针对。这样,第一个索引存储块中为前四个数据存储块的第一个键值的索引项,它们分别是10、30、50和70。按照前面假定的键值模式,第二个索引存储块中为第五至第八个数据存储块的第一个键值的索引项,它们分别是90、110、130和150。图中我们还列出第三个索引存储块存放的键值,它们分别是假设的第九至第十二个数据存储块的第一个键值。

图3-3 顺序文件上的稀疏索引

在已有稀疏索引的情况下,要找出查找键值为K的记录,我们得在索引中查找到键值小于或等于K的最大键值。由于索引文件已按键排序,我们可以使用二分查找法来定位这个索引项,然后根据它的指针找到相应的数据块。现在我们必须搜索这个数据块以找到键值为K的记录。当然,数据块中必须有足够的格式化信息来标明其中的记录及记录内容,可以采用2.5节和2.7节中的任何技术。

http://book.51cto.com/art/201012/238283.htm

稠密索引和稀疏索引

稠密索引: 在密集索引中,数据库中的每个搜索键值都有一个索引记录。这样可以加快搜索速度,但需要更多空间来存储索引记录本身。索引记录包含搜索键值和指向磁盘上实际记录的指针。

稀疏索引

稀疏索引: 在稀疏索引中,不会为每个搜索关键字创建索引记录。此处的索引记录包含搜索键和指向磁盘上数据的实际指针。要搜索记录,我们首先按索引记录进行操作,然后到达数据的实际位置。如果我们要寻找的数据不是我们通过遵循索引直接到达的位置,那么系统将开始顺序搜索,直到找到所需的数据为止。

https://cloud.tencent.com/developer/article/1711134

Innodb底层存储数据 B+树索引的两种类型

聚集索引: 通过每张表的主键顺序进行存放,其叶子节点存放的是这张表的每行完整数据。也正是我们有时称呼的主键索引 (对比一下稠密索引)

非聚集索引 (辅助索引,二级索引): 其叶子节点并不包含行记录的全部数据,其叶子结点的数据包含书签和键值 (用于创建索引的字段值),书签的作用是找与索引相对应的行数据。也就是对应聚集索引的主键值。你是否有想过对应的描述的索引值 关系 看完稀疏索引和稠密索引还有聚集索引和非聚集索引的概念,我们是否能看出他们有什么关系。 聚簇索引 (主键索引)是稠密索引,因为主键索引是所有的值都不为空,每一个搜索码都会有对应的行记录。 非聚集索引是稀疏索引,非聚集索引有唯一索引,普通索引,复合索引。他们的特征就是不会为表得每个值创建搜索码,而是为单个或多个字段创建,且行记录的某些值可以为null。当我们的where条件不止单个条件的时候我们也会首先通过索引查找出来一批数据,然后进行顺序查找筛选,所以是完全复合稀疏索引的条件的。 优势 通过上面的了解,稀疏索引占用空间少,但是在查询的精确率上还是相对于稠密索引还是比较慢的,因为不需要顺序查找,还有回表。 稠密索引那就是相对来说比较快,因为他可以精确定位数据,但是占用的空间比较大。

https://cloud.tencent.com/developer/article/1711134

聚集索引,非聚集索引,主键索引,覆盖索引