密集索引和稀疏索引的区别

密集索引和稀疏索引的区别

a)密集索引文件中的每个搜索码值都对应一个索引值,其叶子节点保存不仅仅是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只能有一个物理排列顺序,所以一个表只能创建一个密集索引。

b)稀疏索引文件只为索引码的某些值建立索引项,其叶子节点仅保存了键位信息以及该行数据的地址或者主键。

咱们来对MySql做具体分析,mysql主流的两种存储引擎,一种是MyISAM,另外一种是Inodb,前者不管是主键索引,唯一键索引或者普通索引,其索引均属于稀疏索引,而InnoDB必须有且只有一个密集索引:

a) 若一个主键被定义,该主键则作为密集索引

b) 若没有主键被定义,该表的第一个唯一非空索引则作为密集索引

c) 若不满足以上条件,InnoDB内部会生成一个隐藏主键(密集索引)

d) 非主键索引存储相关键位和其对应的主键值,包含两次查找

如上图,InnoDB使用的是密集索引,将主键组织到一颗B+Tree中,而行数据就存在叶子节点上,因为InnoDB的主键索引和对应的数据是保存在同一个文件当中的,所以检索的时候在加载叶子节点的主键进入内存的同时,也加载了对应的数据,即若使用 where id = 14 这样的条件查询主键,则按照B+Tree的检索算法即可查找到对应的叶子节点并获得对应的行数据;若对稀疏索引进行条件筛选,则需要经过两个步骤,第一步在稀疏索引的B+Tree中检索该键,对应到主键信息,第二步是根据找到的主键信息在B+Tree中再执行一遍B+Tree的索引操作,最终再到达叶子节点获取整行的数据。

MyISAM使用的均为稀疏索引,其主键索引和其他辅助键索引的两颗树看上去没什么不同,节点的结构完全一致,只是存储的内容不一样而已,主键索引B+Tree的节点存储了主键, 辅助键索引B+Tree的节点存储了辅助键,表数据存储在独立的地方,也就是索引和数据是分开存储的,这两类索引的B+Tree叶子节点都使用地址指向真正的表数据,对于表数据来说,这两类键没有任何的差别。

更多内容请扫描二维码关注“码农TT”

原文地址:https://www.cnblogs.com/liermao12/p/10504120.html

时间: 2024-11-04 10:03:01

密集索引和稀疏索引的区别的相关文章

数据库稠密索引与稀疏索引

一.稠密索引 如果记录是排好序的,我们就可以在记录上建立稠密索引,它是这样一系列存储块:块中只存放记录的键以及指向记录本身的指针,指针就是一个指向记录或存储块地址.稠密索引文件中的索引块保持键的顺序与文件中的排序顺序一致.既然我们假定查找键和指针所占存储空间远小于记录本身,我们就可以认为存储索引文件比存储数据文件所需存储块要少得多.当内存容纳不下数据文件,但能容纳下索引文件时,索引的优势尤为明显.这时,通过使用索引文件,我们每次查询只用一次I/O操作就能找到给定键值的记录.  www.2cto.

索引和唯一索引的区别

索引是我们经常使用的一种数据库搜索优化手段.适当的业务操作场景使用适当的索引方案可以显著的提升系统整体性能和用户体验.在Oracle中,索引有包括很多类型.不同类型的索引适应不同的系统环境和访问场景.其中,唯一性索引Unique Index是我们经常使用到的一种. 唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束.添加唯一性索引的数据列可以为空,但是只要存在数据值,就必须是唯一的. 那么,在使用唯一性索引时,同一般索引有什么差异呢?下

MySQL单列索引和组合索引的区别介绍(转)

原文:http://database.51cto.com/art/201011/233234.htm MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习. 为了形象地对比两者,再建一个表: CREATE TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, vc_Name VARCHAR(50) NOT NULL, vc_Cit

蛋疼的郁闷——聚集索引扫描、非聚集索引扫描、表扫描区别

聚集索引扫描,首先我们知道数据它是以索引键为叶节点排列起来的树形数据结构,表中每行的数据都附属在索引键中,对这样的表进行数据查找时,最快的方式当然是“聚集索引查找”.什么情况下才是“聚集索引扫描”呢?是当你要查找的数据的条件字段上没有索引时,此时查询执行器将对整个表中的数据挨个的进行读取确认符合查询条件的数据,但当该表上有字段设有聚集索引时,该扫描过程称之为“聚集索引扫描",相反的情况是当该表上没有一个字段设有”聚集索引“时,该扫描过程称之为”表扫描“.其实他们本质上的过程都是一样的,就是挨个的

蛋疼的郁闷-聚集索引扫描、非聚集索引扫描、表扫描区别

本文适用于对数据库索引有一定深入的攻城师阅读参考. 我们对于聚集索引扫描和表扫描比较容易理解的,但是对于非聚集索引扫描不太容易理解,这一点也往往容易使初学者感到很是困惑,原因是总认为没必要存在非聚集索引扫描,因为如果查询结果不具有高选择性的话,在聚集索引表中可以使用聚集索引扫描,在对表中会使用表扫描的,那么为什么要会存在非聚集索引扫描呢? 之所以有这样的问题,是因为我们没有考虑到一种情况,那就是查询结果如果被建有非聚集索引的字段覆盖或包含了,而此时where条件字段上的非聚集索引对于本次查询结果

MySQL的btree索引和hash索引的区别

Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引. 可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以

oracle唯一索引与普通索引的区别和联系以及using index用法

oracle唯一索引与普通索引的区别和联系 区别:唯一索引unique index和一般索引normal index最大的差异是在索引列上增加一层唯一约束.添加唯一索引的数据列可以为空,但是只要尊在数据值,就必须是唯一的. 联系:1)unique index就是额外添加唯一性的约束.该约束严格的保证索引列的取值是唯一的,这在一些数据列上的业务约束是很重要的功能.比如一个数据列,不能作为主键,而且允许为空,但是业务上要求唯一特性,这个时候用唯一性索引就是最好的旋转.2)性能上两者并无很大区别. u

Mysql主键索引、唯一索引、普通索引、全文索引、组合索引的区别

原文:Mysql主键索引.唯一索引.普通索引.全文索引.组合索引的区别 Mysql索引概念: 说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,目录是要占纸张的,而索引是要占磁盘空间的. Mysql索引主要有两种结构:B+树和hash. hash:hsah索引在mysql比较少用,他以把数据的索引以hash形式组织起来,因此当查找某一条记录的时候,速度非常快.当时因为是has

MYSQL中的普通索引,主健,唯一,全文索引区别

MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记录数量越多,这个操作的代价就越高.如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置.如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍. 总体分析 PRIMARY, INDEX, UNIQUE 这3种是一类 PRIMARY 主键. 就