文章目录

  • 1.索引是干啥的?
  • 2.索引的使用场景以及付出的代价
  • 2.1 索引的使用场景
  • 2.2 创建索引需要付出的代价
  • 3.索引背后的数据结构
  • 3.1 哈希表
  • 3.2 二叉树(搜索树)
  • 3.3 B树
  • 3.4 B+树


1.索引是干啥的?

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针,能够帮助高效获取数据,加快数据库的查询速度。

2.索引的使用场景以及付出的代价

2.1 索引的使用场景

对于以下条件:
		1、数据量较大,且经常对这些列进行条件查询;
		2、数据库表的新增、修改以及删除操作频率较低;
		3、磁盘空间够大。
	若当前场景满足,可以考虑对表中的字段创建索引,以提高查询效率;反之,若经常做插入、修改以及删除操作,或者磁盘空间不足时,不建议创建索引。	
	例如:我们日常生活中的书籍目录就是索引。

2.2 创建索引需要付出的代价

世间的任何东西都是一把双刃剑,万物相生相克,都有它的好的一面和坏的一面。当然索引也不例外。索引提高查找的速度的同时,
也占用了更多的磁盘空间,并且拖慢了新增、修改以及删除操作的速度。
	虽然看起来索引的坏处好像更多,但在很多场景中查找操作往往是最高频的操作。

3.索引背后的数据结构

3.1 哈希表

虽然哈希表的查找速度很快,为O(1),但它只针对于“相等”进行判定,并不支持范围快速查找,范围查找时还是只能通过扫描全表方式。
	显然这种数据结构并不适合作为经常需要查找和范围查找的数据库索引使用。

3.2 二叉树(搜索树)

如果该二叉树是单枝树,如图

java中索引在什么情况下会用到 索引在什么情况下使用_mysql


时间复杂度为O(N),显然也不太适合。

3.3 B树

B树的结构:

java中索引在什么情况下会用到 索引在什么情况下使用_b树_02

容易看出树的高度减少了,查询单个值时执行IO操作的次数也随之减少了,比较适合单个值的查找;但对于范围查询,需要从根节点进行多次遍历,
 执行IO操作的次数较多,所以也不太适用。

3.4 B+树

B+树相对于B树做了一些改进,具体结构为:

java中索引在什么情况下会用到 索引在什么情况下使用_java中索引在什么情况下会用到_03

B+树中:只有叶子节点才会存储数据,非叶子节点至存储键值。因此非叶子节点占用的空间较小,条件允许可以直接放在内存中,使得磁盘IO操作的次数几乎为0;
叶子节点之间使用指针连接,最底层的叶子节点形成了一个有序链表,使得非常适用范围查找;并且所有的查询最终都会落在叶子节点上,使得每次查询IO的操作次数差不多,查询速度稳定。
	可以看到B+树可以保证等值和范围查询的快速查找,MySQL的索引就采用了B+树的数据结构。