密集索引和系数索引的区别

  • 密集索引文件中的每一个搜索码值都对应一个索引值
  • 系数索引文件只为索引码的某些值建立索引

密集索引决定了表的物理排列顺序,一个表只能有一个物理排列顺序,所以一个表只能创建一个密集索引
在这里插入图片描述

以mysql为例,有myisam存储引擎为稀疏索引,innodb存储引擎为密集索引。
MyIsam
不管是主键索引,唯一键索引或者普通索引,都属于稀疏索引
InnoDB

  • 若一个主键被定义,该主键则作为密集索引
  • 若没有主键被定义,该表的第一个唯一非空索引则作为密集索引
  • 若不满足以上条件,innodb内部会生成一个隐藏主键(密集索引)。这个隐藏的主键是一个6字节的列,该列的值会随着数据的插入自增。也就是说innodb必须有一个主键,而该主键必须作为唯一的密集索引而存在。
  • 非主键索引存储相关键位和其对应的主键值,包含两次查找
    在这里插入图片描述
    密集索引中,索引和数据在一个文件中,所以在检索的时候,在加载叶子节点的主键进入内存的同时,也加载了对应的数据,即若使用了where id = '14'这样的条件查询主键,则按照b+tree的查找算法,即可查找到对应的叶子节点,并获得对应行的数据

若对辅助键索引进行条件筛选,则要经过两个步骤,第一步,在稀疏索引的b+tree中,检索该键,获取主键信息。第二步,使用主键where id = ‘14’,在b+tree中再执行一次b+tree的检索操作,最终到达叶子节点获取行数据

稀疏索引
在这里插入图片描述
稀疏索引中,节点的结构完全一致,只是存储的内容不一样,主键索引的B+tree中存储主键,辅助键索引中存储辅助键。这两个B+tree的叶子节点都指向同一个地址指向真正的表数据。对于表数据来说,这两个键没有任何差别,由于索引树是独立的,通过辅助键检索无需访问主键索引树。

同样还以MyIsam和InnoDb为例,以InnoDB为引擎创建的表会在磁盘上创建两个文件.frm.idb,而MyIsam创建三个文件.frm.myi.myd
InnoDb
.frm存储表结构
.idb文件存储索引和表数据。
MyIsam的索引和数据是分开的
.frm存放表结构
.myi存放索引
.myd存放数据

发布了69 篇原创文章 · 获赞 18 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章