索引
帮助MySQL高效获取数据的排好序
的数据结构
;
常见的索引结构
- 二叉树
- 红黑树
- hash
- b-tree
- b+tree
索引真正使用的数据结构
二叉树
缺点:一个节点只有两个子节点,当数据量很大时,树的深度很大,要进行多次查询,而且容易造成两边不平衡。
红黑树
优点:解决了二叉树不平衡的问题。
缺点:当数据量很大时 ,树的深度还是很高。
hash
缺点:不能进行范围查找。
b-tree
度(degree)- 节点的数据存储个数
叶节点具有相同的深度
节点中的数据key从左到右递增排列
优点:因为度可以让一个节点存储多个数据,所以大大降低了树的深度。
那是不是度越大越好呢?
答案:不是,当使用索引时,会把树的节点数据从索引文件中读取到内存中,这个读取大小的单位和计算机有关,不过一定是页(一般一页是4k)的整数倍,如果一个节点的数据太大,就会多次向内存中加载数据,也就是进行多次IO操作,这是非常耗性能的。
b+树
和b树不同的是:
- b+树非叶子节点中的数据是只存储key,不存储数据,单个数据节点的大小减小,可以把树的度设置的更大,从而减少查询次数,提高查询速度。
- b+树叶子节点存储key和value,从左到右升序排列,并且以指针相连,大大提高了范围内查找的速度和效率。
索引实现
存储引擎是设置在表级别的
Myisam索引实现(非聚集)
- Myisam索引文件和数据文件分离
在MySQL的data/mysql/目录下一般一张表有三个文件:
.frm:表结构文件
.myd:数据文件
.myi:索引文件 - 索引文件叶子节点中value是数据在数据文件中的地址
- 主键索引与非主键索引存储方式相同
InnoDB索引实现(聚集)
- InnoDB索引文件和数据文件放在一起
在MySQL的data/mysql/目录下一般一张表有二个文件:
.frm:表结构文件
.idb:索引文件和数据 - InnoDB必须有主键,推荐是自增类型。如果没有主键会自动从列中选一个列作为主键,如果都不符合做主键的条件,则InnoDB会为该表创建一个主键。
- 主键索引中value是数据(可以理解为一条记录)
- 非主键索引中value是主键索引中的主键。
- 为什么非主键索引不和主键索引一样value中放置数据呢?
这就和事务有关了,如果value中都存储数据,则进行更新和插入数据时,这两个索引结构都要改变,而且还要实现事务的ACID特征,不易实现,效率也不高。