数据库索引有哪几种(快速了解数据库索引原理)

前言

你知道索引长什么样吗?

当磁盘剩余空间较小时,为什么我们加了索引会导致磁盘空间不足?

为什么多加了几个索引,mysql 插入和删除的效率反而下降了呢?

带着这些问题,我们开始今天的话题。

数据库索引有哪几种(快速了解数据库索引原理)

什么是索引?

索引(Index)是帮助数据库系统高效获取数据的数据结构,数据库索引本质上是以增加额外的写操作与用于维护索引数据结构的存储空间为代价的用于提升数据库中数据检索效率的数据结构。

总结一下就是,索引就是数据结构!!一种为了提升检索效率的数据结构。

常见的数据库的索引有:hash 表、B+树等。

那索引物理上是怎么表现的呢?其实我们上一篇《mysql的数据到底是怎么存的(下)|mysql系列(5)》中讲到:MySQL 的存储结构分为 5 级:表空间、段、簇、页、行。创建一个索引就会创建两个段:一个数据段、一个索引段。

InnDB的索引为什么是B+树?

二叉树的查找效率也非常高,比如平衡二叉树,我们在数据结构和算法中经常会用到二叉树的思想来解决问题,我们都知道mysql用的是B+树,那么为什么InnDB 不用二叉树呢?

因为平衡二叉树这种结构在内存里面的查找效率是比较快的。但是

索引是存在于索引文件中,是存在于磁盘中的。因为索引通常是很大的,因此无法一次将全部索引加载到内存当中,因此每次只能从磁盘中读取一个磁盘页的数据到内存中。而这个磁盘的读取的速度较内存中的读取速度而言是差了好几个级别。

因为二叉树序列化到磁盘的时候,其物理实现是数组,具体可以参考

《一文搞定二叉树—由二叉树到贪心算法》

然后由于在逻辑结构上相近的节点在物理结构上可能会差很远。因此,每次读取的磁盘页的数据中有许多是用不上的。因此,查找过程中要进行许多次的磁盘读取操作。

二叉树做索引有什么问题?

二叉树应用在磁盘这类的搜索那么会有以下几个问题:

  • 数据非常大时, 树高度会很高, 造成磁盘io扫描次数很高
  • 一个节点只是存放一个数据, 数据与数据之间在物理内存相隔甚远, 磁盘扫描需要频繁转动
  • 需要频繁的从磁盘读数据到内存中, 即使操作系统有预读, 但是带出来的大多是暂时用不上的无用数据, 造成浪费

这里我们复习一下几个知识点:

磁盘IO时间

  • 磁盘IO时间 = 寻道 + 磁盘旋转 + 数据传输时间

机械硬盘的连续读写和随机读写的性能差异

  • 顺序访问:内存访问速度是硬盘访问速度的6~7倍(kafka的特点,以后有机会的话再讲一讲)
  • 随机访问:内存访问速度就要比硬盘访问速度快上10万倍以上随机读写时,磁头需要不停的移动,时间都浪费在了磁头寻址上。而在实际的磁盘存储里,是很少顺序存储的,因为这样的维护成本会很高。

局部性原理与磁盘预读:

由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理:

当一个数据被用到时,其附近的数据也通常会马上被使用。

程序运行期间所需要的数据通常比较集中。

由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率。

总结一句话:由于磁盘的存储及访问的特性及二叉树的物理存储方式导致二叉树在磁盘上的查询速度很慢,不适合做索引。

B+树的引入

鉴于以上几个问题, 有以下几点需要优化的:

  • 减少磁盘io扫描次数。
  • 减少磁盘io转动频率。
  • 利用好操作系统的预读, 局部性原理。

B树是为了充分利用磁盘预读功能来而创建的一种数据结构,也就是说B树就是为了作为索引才被发明出来的的。

B+ 树的特点

  • b+树拥有b树的所有优点, 并且b+树的非叶子节点不存放数据, 而是单单存放索引, 只有在叶子节点存放索引+数据, 并且叶子节点通过前后指针构成双向链表的结构, 因此通过树结构定位到索引后, 可以通叶子节点的链表指针很快的直接遍历得到范围查询的结果 这样更好的利用了顺序io比随机io性能更高的优化. 这个特点是b树不具备的.
  • b+树是innodb的底层数据结构, 通过N叉树, 节点页, 叶子节点链表串起来, 避免了过多的磁盘io扫描, 转动次数, 并且利用了操作系统的预读和局部性原理, 更支持了范围查询的功能.

B+ 树的优点

  • B树/B+树与红黑树、平衡二叉树等二叉树相比,最大的优势在于树高更小。
  • Innodb中每个节点使用一个页(page),页的大小为16KB,其中元数据只占大约128字节左右(包括文件管理头信息、页面头信息等等),大多数空间都用来存储数据。
  • 对于一颗3层B+树,第一层(根节点)有1个页面,可以存储1000条记录;第二层有1000个页面,可以存储1000*1000条记录;第三层(叶节点)有1000*1000个页面,每个页面可以存储100条记录,因此可以存储1000*1000*100条记录,即1亿条。而对于二叉树,存储1亿条记录则需要26层左右。

总结一下

现在我们可以回答开头的几个问题了。

InnoDB 就是一个B+树的数据结构。

每加一个索引就会生成两个文件,所以当服务器磁盘空间少时加了索引会导致磁盘空间不足。

索引多的话,每次添加删除数据都会维护多个文件,效率反而降低。

秒鲨号所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈!本站将在三个工作日内改正。
(0)

大家都在看

  • 请问so是什么意思

    简要回答 SO是shipping order的简称,表示装货单的意思,是货主用以向海关办理出口货物申报手续的主要单据之一。 学英语时候经常会遇到so这个单词,除了在英语里面应用之外…

    2022年12月4日 百科问答
  • 天牛有毒吗能用手拿吗(万一被咬处理方法)

    天牛本身没有毒,但它的唾液有毒性,被咬后立即把伤口上的血液挤出来,然后再用肥皂水清洗伤口。如果没有及时把伤口血液挤出,毒液会散发到全身,严重时会出现头晕恶心症状。   天牛是多食亚…

    2022年5月24日
  • 白菜炒豆腐怎么炒好吃

    简要回答 常吃白菜豆腐保平安,其实白菜炒豆腐是一道家常菜,制作方法非常简单。首先把白菜洗干净切成段,而豆腐切成小块,焯水,控干水分,锅中放油,把豆腐煎成金黄色,放入白菜炒熟就可以了…

    2022年5月29日
  • 健康产业的创业项目排行榜(中国十大健康产业排名)

    21君:“认可商业之美,崇尚自我奋斗”,著名财经作家吴晓波称他是“一个在喧嚣的世界里死磕自己的匠人”。 清华经管学院教授钱小军老师则评价他“总是表现出探寻商业本质和获取管理真知的热…

    2022年9月25日 百科问答
  • 猫咪踩奶是什么行为

    简要回答 两只猫咪的时候发现猫咪会有一个踩奶的行为,其实猫咪在非常舒服的情况下就会经常踩主人的肚子,胳膊或者是棉被,猫垫等。一般在采奶的时候,我们都觉得猫猫这个时候非常的舒服,可能…

    2022年6月2日
  • 奥克斯扁桶热水器怎么样(附扁桶与圆桶热水器的优缺点)

    厨卫电器代理商都知道储水式电热水器有扁桶与圆桶两种类型。而一般扁桶要比圆桶贵些。那麼扁桶确实要比圆桶好吗?两者有什么不同?今日华产磁能电热水器小编讲解一下圆桶电热水器与扁桶电热水器…

    2022年6月8日
  • 最难写的字是什么?

    biáng “biáng”字来自陕西关中地区的面食Biangbiang面。biáng是一种口语化的象声词,有时为口头禅,或童语。笔画56画,是最难写的一个字。 biáng字书写笔画…

    2022年1月13日
  • 有意义的名字

    宝宝出生后,宝爸宝妈们都很头疼该给宝宝取个什么样的名字,宝爸宝妈们都希望能给自己的孩子起一个有意义的名字,那么该如何取有意义的名字呢? 简要回答给宝宝取名字都很慎重,代表着宝爸宝妈…

    2023年2月7日 百科问答
  • 淘宝退款小二介入有用吗?多久能退款?

    这个不一定,小二是需了解双方的证据情况的,如果你已提交有力的证据给淘小二,快的话24小时内就能处理。慢的话4-6个工作日会给出办理意见。 淘宝退款小二介入多久退款? 根据维权类型的…

    2022年11月4日
  • 盘点世界钢笔排名(最值得入手的8款世界钢笔)

    1、MONT BLANC/万宝龙(德国) 论钢笔综合实力,全世界曾经分出德、意、美、日四大派系,而今偏重实业的美系集体式微,依旧坚挺的只剩热衷捣鼓的德意日。意系精于笔杆创意,日系则…

    2022年9月29日 百科问答
品牌推广 在线咨询
返回顶部