面试题

某年某月某日,在求职面试的过程中被多家公司问及数据库的索引问题,问题如下:
1.你有了解索引吗?
2.你知道索引的具体实现原理吗?
3.你知道索引的数据结构是什么吗?
俗话说,初生牛犊不怕虎,不知者无畏,我第一次回曰:
索引就是把索引那个字段的内容复制到磁盘中做一个目录啊,但那时会消耗系统资源的。
第二次回曰:
索引的数据结构…好像是字典,json格式,好像…
然后面试官直接就问我有没有学过数据库的啊!然后我回来百度了一波,原来正确的答案跟自己的回答真的是风马牛不相及啊,血一般的教训啊,特以此文纪念我这些年装逼装过头的岁月…

数据库索引原理的本质

其实索引的数据结构就是索引的原理,面试官一直变着问题来希望我答出正确的答案,但我天真的把它们当成了不相干的问题。
索引的本质依赖于平衡树这一种数据结构。所谓的数据库的索引就像书的目录,这个目录的实现靠的就是这个平衡树。
平衡树:
平衡树是树结构的一种,大家都知道,树结构在查找和分类回归问题中有广泛的应用,它的原理就是把巨大的数据做分段分类,方便查询,就像图书馆中的树一样,先以学科分室,再以专业分区,再以课程分书架…平衡树就是借鉴了这个管理书籍的原理,比如,你在经典的学生表中的学生姓名字段上创建了索引,而这个学生表包含了全国所有的小学生,大概有好几亿的数据量,如果你一条一条的查,查一条用时1毫秒就是几亿毫秒…而建立了索引以后,数据库首先把这几亿的学生按照某种规则分成10类(这个10类是我随便指定的,这实际中数据库是根据什么定的这个数量是有一定的算法的),那么没类就是几千万,然后对于每类下再分十类,如此下去,就分成了亿,千万,百万,十万,万,千,百,十,个九级,查询任意人名的时候计算机只需遍历这九级,遍历几十遍即可。所以索引的奇妙作用是摆在这的,他能成千上亿倍的提升查询的速度!当然,构建这个索引或者说构建这个平衡树的算法是个浩大的工程,是很耗时间的,就像图书馆刚刚建立的时候,要将数以百万计的书籍分门别类是很吃力的,因为数据库他要一个一个的遍历学生姓名的第一个字的编码值,根据这个字的编码值的取值范围来分成十段,再在每一段里做更加精细的分类,这个算法是复杂而庞大的,因为对于字符串的分类规则,不仅要考虑中文英文如何分,还有考虑数字等其他所有可能的其他字符的排序问题,在此我们就不关心数据库的底层算法了。说完平衡树,下面说说所有都有那种类型或实现方式:

索引的分类

索引主要有几种:

  • 聚集索引
  • 非聚集索引
  • 覆盖索引

上面举例的学生姓名字段他是一个字符串,但以它为索引最终找到的只是符合条件的姓名,并不能找到该姓名的学生的其他信息。比如,查找所有姓王的学生,那么你只能找到一推姓王的名字,因为你建立索引的时候只是把姓名这一个字段拿出来构建平衡树的,并没有拿出除姓名以外的字段,比如成绩,姓名。事实上我这样说并不准确,应为数据库其实在你创建索引的时候会默认把主键值也拿出来,也就是说你查到的不仅有姓名,还有该姓名对应的id。
其实创建主键的时候,数据库已经帮你以主键为字段创建了一个特殊的索引,而且这个索引的子叶就是数据的一条完整的记录,也就是说整个数据表就是一张大的索引表,那么为什么要这样做呢,其实也好理解,因为当你加了主键,主键就一定是有序的,是从1开始的递增序列,也就是说主键它不像其他的字段一样要有庞大复杂的算法整理才能有序,才能构建平衡树。由于主键这种天生的优势,构建平衡树根本就不用干什么事情,那么我们为什么不用主键把整张表构成平衡树呢,这样我们就可以根据主键查询几十次就能从几亿的数据中检索出我们想要的数据。主键的索引其实他有一个专门的名称,叫做聚集索引。
由以上分析我们也可以轻易理解,一张表只能有一个主键和一个聚合索引的原因。
回到上面只能查姓名的问题,查到姓名,然后得到姓名的id,我们就可以根据这些id做聚集索引就能查到真正的记录了。所以,任何索引都是以聚集索引为基础的。
还有一种特殊的索引,上面说到了,在做索引的时候,数据库自动的帮我们加入了id这个字段绑定到我们构造的索引字段上,其实我们也可以指定其他字段加入到我们创建的索引字段上。比如把成绩这个字段加入到姓名字段上,一起做索引,那么其实索引表上就有姓名,成绩,id三个字段了,此时你查到对应的姓名就能直接得到对应姓名的成绩了,而不必再通过聚集索引去查询原始的记录了。这个叫做覆盖索引。
正常情况下,如果我们在两个以上的字段上创建索引其实这几个索引是独立创建的,并不相关。而我们创建的覆盖索引,可能两个字段显示都有索引,但它们的索引名是一样的,因为本质上覆盖索引其实只是创建了一个索引。

面试题之数据库索引原理相关推荐

  1. B-treeB+tree数据库索引原理

    B-tree&B+tree:https://www.cnblogs.com/vianzhang/p/7922426.html 数据库索引原理:https://www.cnblogs.com/a ...

  2. 【MySQL】数据库索引原理 | 索引数据结构 | B+Tree

    数据库索引原理 | 索引数据结构 | B+Tree 文章目录 数据库索引原理 | 索引数据结构 | B+Tree 一. 数据库索引简介 二. 红黑树 与 B-Tree 1. 红黑树 2. B-Tree ...

  3. 数据库索引原理,及MySQL索引类型

    原文:数据库索引原理,及MySQL索引类型 - weixin_42181824的博客 - CSDN博客  https://blog.csdn.net/weixin_42181824/article/d ...

  4. 大于小于优化_以MySQL为例,详解数据库索引原理及深度优化

    本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...

  5. 数据库性能(一):数据库索引原理解析

    很大一部份程序员对索引的了解仅限于到"加索引能使查询变快"这个概念为止,但有没有考虑过索引为什么能使查询变快呢? 索引是使用B+树(二叉树)实现的数据结构. 上图中左边是数据库中的 ...

  6. 不懂数据库索引原理?因为你心里没有一点B树

    什么是B树? B树是一种数据结构它按排序顺序在其节点中存储数据,B树存储数据使得每个节点按升序包含密钥,这些键中的每一个都有两个对另外两个子节点的引用,Te左侧子节点键小于当前键右侧子节点键多于当前键 ...

  7. 大于小于优化_架构 - 以MySQL为例,详解数据库索引原理及深度优化

    一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如 ...

  8. Mysql数据库索引原理及算法原理

    前言 面试的时候总会被提及一些关于数据库操作的问题,那么数据库索引作为一项热门问题,总会被问到.最近在网上看到了一篇关于mysql数据库索引的好文章,认真看完之后肯定受益匪浅,(虽说有的地方我不太理解 ...

  9. mysql的数据库的索引_MySQL 数据库索引原理与分类

    前言 数据库索引本质上是一种数据结构(存储结构+算法),目的是为了加快目标数据检索的速度. 目录 1.索引的本质与原理? 2.索引的分类? 1.索引的本质与原理 我们先看一个问题: 假设现在有1000 ...

最新文章

  1. 【yolo目标检测】(1) yolov3,网络结构Darknet53,特征提取
  2. python储存数据的容器_Python基础四容器类数据
  3. html5 静态网页 线程,HTML5 Web Workers之网站也能多线程的实现
  4. .net源代码已经可以调试
  5. VTK:Texture之TextureCutQuadric
  6. MySQL--更新自增列的潜在风险
  7. Linux 进程状态介绍
  8. 【Python系列】之判断字符是否为数字
  9. IDEA 快速创建 SpringBoot 项目
  10. QQ for linux不用udp8000端口?
  11. 简明python教程五----数据结构
  12. FTX交易平台与AZA Finance达成合作,推动非洲数字经济发展
  13. 华为云mysql qb文件恢复到本地-参考华为云官方文档
  14. 初创的云平台公司是否需要设立运维岗
  15. 爬楼梯,假设你正在爬楼梯,需要 n 步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶?
  16. 使用Python茅台抢购脚本的使用说明
  17. 什么是VR虚拟电子沙盘3D数字沙盘有什么功能
  18. 嵌入式开发板硬件操作入门学习9——集成电路芯片手册术语词汇表(中英文对照)
  19. 小米多模网关更新失败1.4.4-0003
  20. 转载---终于懂了通信这个行业,我却已经离开!

热门文章

  1. java都市男人心痒痒_男人听了扛不住的情话,教你说的男人心痒痒的情话
  2. 谈谈Spine动画在产品中的应用
  3. undertow 怎么创建线程_springboot项目中使用undertow web服务器
  4. java微信群自动回复_JAVA实现 springMVC方式的微信接入、实现消息自动回复
  5. 树的直径1——树的直径
  6. vue教程入门视频,vue3.0视频教程
  7. 【安卓注意事项】模仿猎豹清理大师波效应
  8. centos7安装killall命令
  9. 上海公积金管理中心一览表
  10. linux 开机速度 固态,Ubuntu18开机速度突然变慢问题的解决(2019.11.05)