一、索引的数据结构
数据库索引的数据结构主要有四种
1、二叉查找树
二叉查找树是对半查找,其时间复杂度为O(logn),但是最坏情况下会变成O(n)(排成线性表时)。
2、B树
B树出现的原因是为了降低树的深度,减少访问IO次数来优化查询速率。查询速率与二叉查找树一样高效。
3、B+树(MySql采用的)
B+树是B树的变体,其定义基本与B树相同,除了:
a、非叶子节点的字树指针与关键字个数相同
b、非叶子节点仅用来索引,数据都保存在叶子节点中。
c、所有叶子节点军头一个连指针指向下一个叶子节点,方便做范围统计
优势:
1、B+树的磁盘读写代价更低(根节点只存索引,不存数据)
2、B+树的查询效率更加稳定(所有关键字查找效率相同,必须到叶子节点)
3、B+树更有利于对数据的扫描(有一个链指针连接所有的叶子节点)
4、hash散列表
效率极高,但是
1、不能使用范围查询,
2、无法被用来避免数据的排序操作,
3、不能利用部分索引键查询(用的组合索引)
4、不能避免全表扫描
5、遇到大量Hash值相等的情况下,性能不一定比B树高
常见问题
1、为什么要使用索引?
使用索引可以快速查询数据。全表扫描在表小时很快,但是如果表达太大会非常慢。索引类似与字典,可直接查找
2、什么样的信息能够成为索引?
主键、唯一键、普通键等。主要是一些关键信息,能够让数据具备区分性的字段。
3、密集索引和稀疏索引的区别?
密集索引:每个搜索码值都对应一个索引值
稀疏索引:文件只为索引码的某些值建立索引项。
其中在MySql中InnoDB是密集索引,MyISAM是稀疏索引。
4、联合索引的最左匹配原则
假设查询字段为(a,b,c)建立的联合索引为(a),(a,b),(a,b,c)三个,从形式上看就是索引向左侧聚集,所以叫做最左原则。因此最常用的条件应该放到联合索引组的最左侧。
5、索引是建立越多越好吗?
并不是,因为索引就相当于书本的目录,在表特别小的时候不需要建立索引。而且更多的索引意味着需要更多的空间。