数据库索引的灵魂拷问?

最近一直在回顾一些数据库的知识,顺便就整理了一下一些常见的面试题以及关于一些容易被忽略的知识点,会陆续的在今后的文章里面展示出来,欢迎大家讨论,共同学习。今天我们聊一下关于索引底层的问题,聊聊为什么索引要设计成这个样子

为什么数据库需要索引呢

正如我们知道的,索引的目的是提高查询的速度,对于一些数据量不大的表,我们是否建索引并不重要,因为数据量不大对于磁盘查找来说都是很快的,但是当数据量达到了万级、百万、千万级别的时候,我们的查找速度就不能按照原有的循序查询,必须按指定路线去查找以达到我们提高查询的目的。索引的本质就是为查询数据提供一些便捷的路线,就像去图书馆找书,我们不用一本一本的去找,可以先把书按照按规则存在,比如按大类存放(如属于文学类或者是历史类的),然后在按照各类的子类区分(如历史类可以按朝代划分)。。。。。,通过这样的路线或者规则的指定,我们就可以更为有效快捷的找到书籍.

既然建立索引能加快查询,是否能“多多益善”呢

创建索引和维护索引要耗费时间,每次的新增和修改数据,都需要维护索引。这样的时间随着数据 量的添加而添加。

索引须要占物理空间,除了数据表占数据空间之外,每个索引还要占一定的物理空间.

所以索引不是越多越好的

那建索引的原则有什么呢

这个问题有很多的讲究,需要一定的经验和足够扎实的基础,并非一两句能解释清楚的,足够单独一篇文章进行讲解了

简单来说:建立在经常使用到的列,权衡好优缺点,当优点大于缺点的问题时,就是最合适的

索引有哪些结构/索引常见类型

哈希类型:一种以键-值(key-value)存储数据的结构,我们只要输入待查找的值即key,就可以找到其对应的值即Value ,常用于等值查询

有序数组类型:适用场景:只适用于静态存储引擎。用于等值查询和范围查询(ID值必须是递增的)

搜索树类型:左子节点小于父节点、父节点小于右子节点。Innodb使用B+树(后面会说为什么使用B+树作为索引)

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

我们知道:哈希的查询/插入/修改/删除的平均时间复杂度都是O(1);树,例如平衡二叉搜索树,查询/插入/修改/删除的平均时间复杂度都是O(lg(n))。那为何还要使用树结构呢:

1、哈希索引适合等值查询,但是无法进行范围查询,而范围查询在数据库的使用中是经常被使用到的

2、哈希索引没办法利用索引完成排序

3、哈希索引不支持多列联合索引的最左匹配规则

4、如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题

为什么要使用B+树结构呢

作为扩展,我们认识一下其他的一些常见的树结构为什么不能被使用,有什么优缺点

二叉查找树

eg:图画的有点潦草,见谅见谅


 二叉树

缺点如下: 二叉查找树只有两路,所以当数据量大的时候,会造成树的高度很高,查询的时候会进行多次的磁盘查找,影响查找速度,另外就是,作为非平衡树,极端的情况下会形成单路链表

B树

1、B树是一种多路自平衡的搜索树,可以有效的减低树的高度,提高查询的效率

2、可以达到预读的效果,利用到局部性的原理,能把查询的数据附近的数据一起返回,减低查询的磁盘IO

从上面的点看,B树已经足够的优秀,但是呢Mysql采用的B+树类型是在B树的基础上进行升级,让查询的性能更为优异

B+树

1、B+树集成了B树的优点,另外,B树在的非叶子节点不在保留数据,只保留索引,这就意味着同样的大小的磁盘页可以容纳更多节点元素

2、B树的查找只需找到匹配元素即可,最好情况下查找到根节点,最坏情况下查找到叶子结点,所说性能很不稳定,而B+树每次必须查找到叶子结点,性能稳定

3、另外B树的范围查找需要不断依赖中序遍历。首先二分查找到范围下限,在不断通过中序遍历,知道查找到范围的上限即可。整个过程比较耗时。而B+树的范围查找则简单了许多。首先通过二分查找,找到范围下限,然后同过叶子结点的链表顺序遍历,直至找到上限即可,整个过程简单许多,效率也比较高。

总结

索引就是来加快查询的速度的,数据量大的时候性能尤为明显,但也不是多建就好

通过分析数据结构得知:采用树结构更多的是日常的查询使用决定的,需求决定了设计

采用B+树区分其他树类型的:在于多路自平衡,减低高度,减少磁盘IO,稳定性能

欢迎下方交流讨论。如果本篇博客有任何错误,请批评指教,不胜感激 !

共同进步,学习分享

欢迎大家关注我的公众号【写代码的小杨】,相关文章、学习资料都会在里面更新,整理的资料也会放在里面。

觉得写的还不错的就点个赞,加个关注呗!点关注,不迷路,持续更新!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容

  • 说说你对 MySQL 索引的理解? 索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树, B+...
    _code_x阅读 741评论 0 6
  • 一、数据库索引介绍 索引是一种特殊的文件(MySql数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所...
    it阿布阅读 449评论 0 4
  • MySQL索引类型 一、简介 MySQL目前主要有以下几种索引类型:1.普通索引2.唯一索引3.主键索引4.组合索...
    程序员黄小斜阅读 318评论 0 4
  • 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引...
    方志朋阅读 3,809评论 3 135
  • 01概述 索引是帮助MySQL高效获取数据的排好序的数据结构,用于快速找出某个列中有一特定值的行。 通过上述定义可...
    程序员姜戈阅读 426评论 0 1