索引用于提升数据库的查找速度

索引是建立得越多越好吗   (No)
➢数据量小的表不需要建立索引,建立会增加额外的索引开销
➢数据变更需要维护索引,因此更多的索引意味着更多的维护成本
➢更多的索引意味着也需要更多的空间

 

问题:哈希(hash)比树(tree)更快,索引结构为什么要设计成树型?

为了加快查找速度的数据结构,常见的有两类:

(1)哈希,例如HashMap,查询/插入/修改/删除的平均时间复杂度都是O(1)

(2),例如平衡二叉搜索树,查询/插入/修改/删除的平均时间复杂度都是O(lg(n))

 

可以看到,不管是读请求,还是写请求哈希类型的索引,都要比树型的索引更快一些,那为什么,索引结构要设计成树型呢?

 

索引设计成树形,和需求相关。

对于这样一个单行查询的SQL需求:

select * from t where name=”shenjian”;

确实是哈希索引更快,因为每次都只查询一条记录。

但是对于排序查询的SQL需求:

    分组:group by

    排序:order by

    比较:<、>

   范围查找

哈希型的索引,时间复杂度会退化为O(n),而树型的“有序”特性,依然能够保持O(log(n)) 的高效率。

并且   最重要的是   InnoDB并不支持哈希索引

 

 

问题:数据库索引为什么使用B+树?

先简单介绍下几种树。

第一种:二叉搜索树

二叉搜索树,如上图,是最为大家所熟知的一种数据结构,就不展开介绍了,它为什么不适合用作数据库索引?

(1)当数据量大的时候,树的高度会比较高,数据量大的时候,查询会比较慢;

(2)每个节点只存储一个记录,可能导致一次查询有很多次磁盘IO;

第二种:B树

B树,它的特点是:

(1)不再是二叉搜索,而是m叉搜索;

(2)叶子节点,非叶子节点,都存储数据

(3)中序遍历,可以获得所有节点

第三种:B+树

B+树,仍是m叉搜索树,在B树的基础上,做了一些改进

(1)非叶子节点不再存储数据,数据只存储在同一层的叶子节点上

     B+树中根到每一个节点的路径长度一样,而B树不是这样。

(2)叶子之间,增加了链表,获取所有节点,不再需要中序遍历,这些改进让B+树比B树有更优的特性。

 

总结

数据库索引用于加速查询

虽然哈希索引是O(1),树索引是O(log(n)),但SQL有很多“有序”需求,故数据库使用树型索引

InnoDB不支持哈希索引

另外:虽然都是B+树,但是InnoDB和MyISAM的索引实现也有差异,可以查看我的上一篇博客。