谈谈对于索引的理解

1.索引是干啥的?

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

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

2.1 索引的使用场景

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

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

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

3.索引背后的数据结构

3.1 哈希表

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

3.2 二叉树(搜索树)

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

在这里插入图片描述
时间复杂度为O(N),显然也不太适合。

3.3 B树

B树的结构:
在这里插入图片描述

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

3.4 B+树

B+树相对于B树做了一些改进,具体结构为:
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zzz_yf993

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值