密集索引和稀疏索引的区别
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