简单分析下密集索引和稀疏索引的区别

一、首先 先看一下密集索引和稀疏索引的图片 看图片来实际了解一下

在这里插入图片描述首先先来了解下什么是索引项 索引值 搜索码

索引项包括索引值以及指向该搜索码值的第一条数据记录的指针。

从上图中可以看出:
(一)、密集索引文件中的每一个搜索码值都对应着一个索引值 这就可以理解为叶子结点不但需要保存键值 还保存位于同一行记录的其他列信息。由于密集索引决定了表的物理排列顺序,一个表只有一个物理排列顺序,所以一个表只能创建一个密集索引。
(二)、稀疏索引文件中只为搜索码的某些值建立索引项 这可以理解为叶子结点只保存了键位信息以及该行数据的地址,有的稀疏索引只保存了键位信息主键

说完不同 来说一下优缺点吧

a  稀疏索引占用的索引存储空间比较小,但是查找时间较长;
b  稠密索引查找时间较短,索引存储空间较大。

二、MySql两种存储引擎

  1. MyISAM
在MyISAM中 不管是主键索引 唯一键索引 普通索引 其索引都属于稀疏索引
  1. Innodb
在Innodb中 有且仅有一个密集索引 
Innodb中选取规则:
(1)、如果一个主键被定义了 则该主键作为密集索引
(2)、若该主键没有被定义 则该表的第一个唯一非空索引作为密集索引
(3)、若不满足上述条件 则innodb内部会生成一个隐藏主键(密集索引)
(4)、非主键索引存储相关键位和其对应的主键值 包含两次查找

了解完Innodb和MyISAM这两个引擎后 来个实例看看
在这里插入图片描述
首先 先说Innodb使用的是密集索引 将主键组织到一棵B+树中 而行数据就存储在叶子结点上 因为InnoDB的主键索引和对应的数据是保存在同一个文件中的 所以检索的时候在夹杂叶子结点的组件进入内存的同时也加载了对应的数据 如果查找id=7的主键 可利用B+树的算法即可查找到对应的叶子结点以及行数据。
但如果使用稀疏索引进行条件筛选 则需要两个步骤 在稀疏索引的B+树中检索该键 获取到主键信息 在主键索引的B+树中再执行一遍检索操作 最终再到达叶子结点 获取对应的数据。

看完实例后 看具体数据库使用不同的引擎会建立什么文件吧

1.建立一个MyISAM引擎的数据表 test1 会建立三个文件
test1.frm   存储表的结构信息
test1.MYI  存储表的索引信息
test1.MYD 存储表的数据
2.建立一个InnoDB引擎的数据表 test2 会建立两个文件
test2.frm 存储表的结构信息
test2.ibd 存储表的数据和索引
不同之处很容易就看出来了吧 这里就不多说了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章