什么是索引?

索引是为了加速对表中数据行的检索而创建的一种分散储存的数据结构。

工作原理:

通过我们建立的索引,可以通过命中后的磁盘地址快速的找到我们需要的表数据,比起全表扫描去查询数据,可以大大的提升查找效率。

在关系型数据库中,索引是硬盘级索引。

常见的数据结构

1)二叉树

二叉树相信大家都非常熟悉,以一个节点为根节点,比该节点小的值走左边,大的值走右边。搜索数据时,只要通过它的数据链接就可找到相应的数据。右边为一个节点里的具体组成部分。

缺点:二叉树有个极其致命的缺点,当插入数据为顺序递增或顺序递减时,形成的二叉树就成了单边链条。

这样的话,查找也没有效率可言。

2)平衡二叉查找树

平衡二叉查找树作为二叉查找树的进阶版,改进了二叉查找树的缺点。

定义:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

即,当平衡二叉查找树数据插入时,如果发现形成的树结构违反了它的定义,那么此时树会发生形变,组成一颗相对平衡的查找树。

如果还是以上面的1-5顺序插入时,形成的树结构为

红黑树也是平衡二叉查找树的一种实现。

因此不建议对数据频繁变更的列建立索引,因为在这个过程中,索引的结构变更必然会带来IO流和CPU的损耗。

缺点:

1.搜索效率不足。

因为归根结底还是二叉树结构,因此在数据量大的时候,树的高度极高,也就意味着可能一次查找需要超多次数的IO。

2.节点数据内容太少。

每一个节点中保存的数据远远不够填满一次内存和磁盘交互的值。如果一次内存和磁盘的交互为4KB,那么一个节点中保存的数据其实就大大浪费了这个空间。

3)B tree(多路平衡查找树,绝对平衡)

那么B树如何解决平衡二叉树的缺点呢?

上图是一个三路平衡查找树,因为Btree是多路平衡查找树的原因,它可以是三路,四路,五路六路,路越多,就意味着树的高度越低,那么一次搜索的最大IO次数也就越少。

也因为它的多路特性,一次IO交互的磁盘块中可能保存着巨大数量的节点数据。我们以id为int为例,一次IO交互假设为4KB,那么一次IO交互最多能保存1024个关键字!(当然一个节点中有数据区和子节点引用,粗略计算)。

因此我们在设置数据库的字段类型和字段长度的时候,控制字段类型合理,字段长度合理,就能保证每次索引磁盘块的加载能包含更多数据,从而提升我们的查找效率。

4)B+tree(加强版多路绝对平衡查找树)

我们还是以三路查找树为例

B+树的特点:

非叶节点不保存数据相关信息,只保存关键字和子节点的引用。

所有的数据都保存的叶子节点中。

采用左闭合区间。

叶子节点中的数据顺序排列,并且相邻节点具有顺序引用的关系。

B+树相比B树的优点:

扫库、扫表能力更强

磁盘读写能力更强(因为少保存了个数据区)

排序能力更强

查找效率更加稳定(B树可能一次命中,也可能多次命中,而B+树因为没有保存数据区的缘故,树的高度相对更低,但每次都要查找到最多次数)

mysql中B+tree的具体落地形式

myisam

myisam存储引擎的表会有三个文件

.frm文件存储表定义;

·MYD (MYData)文件存储表的数据;

.MYI (MYIndex)文件存储表的索引。

myisam中的索引结构为平级结构,即id或name索引都会独立指向数据地址值。

innodb

innodb存储引擎的表有两个文件

.frm文件储存表定义;

.ibd储存索引和数据。

innodb是一个以主键为索引来组织数据的存储引擎,主键索引形成数据结构,具体的数据值保存在叶子节点,而辅助索引中的叶子节点保存了指向主文件的主键关键字。如果没有指定主键,innodb会生成隐藏的6位自增列rowid。

索引的几大原则

最左匹配原则

对索引中关键字进行计算和比对,一定是从左往右一次执行,且不可跳过。

高离散度原则

列中的数据重复率越低,离散度越好。

最少空间原则

索引的创建原则为 最左匹配 > 高离散度 > 最少空间。

联合索引和覆盖索引联合索引

单列索引是特殊的联合索引,如果建立的联合索引中包含了单列索引及小于该范围的联合索引,要注意索引的冗余。(例如:index[id,name]>index[name])

覆盖索引

如果查询的列,通过索引项的信息可以直接返回,则该索引为覆盖索引。

例:table(teacher)index(id)

sql:select id from teacher where id = ?

mysql btree面试_java面试题:你了解mysql的B+TREE索引吗?相关推荐

  1. 备战2022年春季面试Java面试题库-数据库Mysql篇《收藏》

    前言 本文主要涉及到的面试问题点比较多各种各样的,本文主要涉及到的是数据库Mysql,面试题我就把我常遇到的和一些出现频率比较多的问题整理出来了. 如果想要学习资料的小伙伴可以点击下面的链接交个朋友我 ...

  2. mysql题库随机抽取试题_Python从MySQL数据库中面抽取试题,生成试卷

    一.背景 本文章主要是分享如何使用Python从MySQL数据库中面抽取试题,生成的试卷每一份都不一样. 二.准备工作 1.安装Python3 2.安装库 pip install python-doc ...

  3. mysql 50道经典面试题_2020年MySQL数据库面试题总结(50道题含答案解析)

    1.MySQL 中有哪几种锁? (1)表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最 高,并发度最低. (2)行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最 ...

  4. 【备战面试】面试题打卡——Mysql相关面试题总结

    ⭐️写在前面 这里是温文艾尔的学习之路

  5. java+mysql性能优化_Java培训实战教程之mysql优化

    Java培训实战教程之mysql优化 更新时间:2015年12月29日13时30分 来源:传智播客Java培训学院 浏览次数: 1.   mysql引擎 1.1.  引擎类型 MySQL常用的存储引擎 ...

  6. mysql where 大小写_java – 使用select where where Mysql在Mysql中区分大小写

    嗨我正在使用 Java前端和Mysql Backend ,,, 实际上在tbl_test中包含 name value --------------- abc 22 xyz 14 ABC 32 xyZ ...

  7. MySQL(面试+原理)(1)--MySQL是如何存储数据的

    MySQL是如何存储数据的 1.MySQL的整体架构介绍 2.MySQL的磁盘文件介绍 MySQL在Linux中的数据索引文件和日志文件一般默认都在/var/lib/mysql目录下. 2.1日志文件 ...

  8. 最新金九银十JAVA面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等

    ** 金九银十的面试旺季即将到来,大家准备的怎么样了?** 今年的处境大家都挺难的,但是也不要因此而堕落,太闲了,就多刷题.坚持学习总归是对自己有好处的. 在此,整理了下金九银十的面试知识点(附答案) ...

  9. 秋招面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等

    轰轰烈烈的秋招季已经开始,有人欢喜有人愁,不管你是喜是忧,学习总归是好的.这不,小编特地整理了一下秋招面试知识点+答案(JAVA岗),一起分享出来给大家看看~ 需要完整版的 知识点+答案 的朋友可以  ...

  10. 金三银四JAVA面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等

    今年的金三已经过去.银四也快过半,大家可以说是都有点难了,有的朋友可能还在被隔离中,但是咱们加油找工作的时候,也要记得保护好自己,不能松懈. 现在的处境大致是有人欢喜有人愁,不管你是喜是忧,坚持学习总 ...

最新文章

  1. 【从单体架构到分布式架构】(二)请求增多,单点变集群(1):负载均衡
  2. 独家 | 手把手教你用Python的Prophet库进行时间序列预测
  3. (转)启动linux远程图形界面登录,vnc!!
  4. 深度学习:推动NLP领域发展的新引擎
  5. 029_jQuery Ajax简介
  6. 记录平时编程或者阅读英文文档的时候不认识的英文单词
  7. 根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组
  8. 等差数列末项计算(信息学奥赛一本通-T1035)
  9. Redis常见的5种不同的数据类型详解
  10. 在 Linux 下搭建 FTP 服务器
  11. 基于PHP+Web+Mysql的在线问卷调查系统
  12. 如何打造成功的数据归档策略
  13. 用快递100接口查询各快递物流信息
  14. 百度竞价有没有好的推广方法?
  15. Attach机制实现完全解读
  16. 从函数型数据到光滑函数
  17. 用 husky 和 lint-staged 构建代码检查工作流
  18. 【案例分析-初探】美国有多少家加油站?
  19. Android mc怎么和win10联机,我的世界实现跨平台联机 Win10玩家可与手机互联
  20. python入门(三)列表、元组、range()、字典

热门文章

  1. 什么是JDBC,JDBC的主要功能是什么?
  2. 计算机机房维护与管理,计算机机房的管理与维护.doc
  3. java中的策略模式_简单了解Java中的策略模式
  4. 慕课python第六周测验答案_大学慕课2020Python编程基础章节测验答案
  5. IDEA拉取GitLab代码出现Git Pull failed remote: HTTP Basic: Access denied
  6. NetworkComms.Net github下载地址
  7. Y-Combinator不同语言实现方案
  8. 转载:《TypeScript 中文入门教程》 17、注解
  9. 如何强制使用某一大小的包去ping某个IP地址?
  10. 安装 Dynamics AX 2012 Data Migration Framework