150道MySQL高频面试题,学完吊打面试官--关于索引的五道大厂面试题,跳槽面试很重要

前言

本专栏为150道MySQL大厂高频面试题讲解分析,这些面试题都是通过MySQL8.0官方文档和阿里巴巴官方手册还有一些大厂面试官提供的资料。
MySQL应用广泛,在多个开发语言中都处于重要地位,所以最好都要掌握MySQL的精华面试题,这也是面试官最喜欢问的,现在面试官在面试的时候更关心的是某个技术点的深度,所以专栏的内容也会从底层开始讲解,本专栏会一直不断的进行更新,欢迎大家一起交流学习。

gongzhonghao【小白的大数据之旅】

一个b+树中大概能存放多少条索引记录?

一个B+树中大概能存放的索引记录数量取决于多个因素,包括B+树的高度、阶数(即每个节点能包含的最大关键字数或子节点数)、以及每个关键字或数据记录的大小等。

  • 真实环境中一个页存放的记录数量是非常大的(默认16KB),假设指针与键值忽略不计(或看做10个字节),数据占 1 kb 的空间:
  • 如果B+树只有1层,也就是只有1个用于存放用户记录的节点,最多能存放 16 条记录。
  • 如果B+树有2层,最多能存放 1600×16=25600 条记录。
  • 如果B+树有3层,最多能存放 1600×1600×16=40960000 条记录。
  • 如果存储千万级别的数据,只需要三层就够了

B+树的非叶子节点不存储用户记录,只存储目录记录,相对B树每个节点可以存储更多的记录,树的高度会更矮胖,IO次数也会更少。

索引记录数量的估算

以一个三层、阶数为4的B+树为例,它能够存放的索引记录数量是相当可观的。具体来说,如果每个节点(包括叶子节点和非叶子节点)都能充分利用其存储空间,并且假设数据记录的大小适中,那么一个这样的B+树可能能够存放数十亿条索引记录。这是一个非常粗略的估算,实际情况会根据具体的数据库实现和配置有所不同。

影响因素

  • B+树的高度:B+树的高度是影响其存储能力的重要因素。高度较低的B+树意味着从根节点到叶子节点的路径较短,因此访问速度较快。但是,随着高度的增加,B+树能够存储的索引记录数量也会显著增加。
  • 阶数(m):阶数m定义了每个节点最多能包含的关键字数或子节点数。阶数越大,每个节点能包含的关键字就越多,从而能够支持的索引记录数量也就越多。
  • 数据记录的大小:数据记录的大小也会影响B+树的存储能力。如果数据记录较大,那么每个节点能存储的关键字数量就会减少,从而限制了B+树的存储能力。相反,如果数据记录较小,那么每个节点能存储的关键字数量就会增加。
  • 磁盘存储单元的大小:磁盘存储数据的最小单元(如扇区、块或页)也会影响B+树的存储能力。较大的存储单元意味着每个节点能包含更多的数据,从而提高了B+树的存储能力。

使用B+树存储的索引crud执行效率如何?

创建(Create)

  • 效率:高。在B+树中,创建新记录通常只需要在最底层的叶子节点新增一条记录。由于新增记录不会改变树的整体结构,因此创建操作的时间复杂度为O(log n),其中n是树的高度。
  • 原因:B+树的叶子节点存储了所有数据的引用,而非叶子节点仅存储键的信息。这种结构使得在新增记录时,可以顺序地将记录写入叶子节点,无需进行复杂的树结构调整。

读取(Read)

  • 效率:高。读取操作通过索引可以快速定位到数据所在的叶子节点,时间复杂度同样为O(log n)。
  • 原因:B+树的有序性和平衡性保证了查找路径的短且稳定。此外,由于所有叶子节点通过链表相连,便于进行范围查找,进一步提高了查询效率。

更新(Update)

  • 效率:相对较低。更新操作可能涉及数据移动,因为需要找到要更新的记录并将其替换为新的记录。如果更新导致节点分裂或合并,还需要调整树的结构。
  • 原因:B+树需要保持平衡性,因此在更新操作时可能需要进行额外的调整工作。此外,如果更新的记录较大,可能还需要考虑节点的存储空间和分裂问题。

删除(Delete)

  • 效率:相对较低。删除操作同样可能涉及数据移动和树结构的调整。特别是当删除操作导致节点下溢时,需要合并相邻节点或向父节点借数据来保持平衡。
  • 原因:与更新操作类似,B+树在删除时需要保持其有序性和平衡性。这可能导致额外的调整工作,从而影响删除操作的效率。

总结

  • 优势:B+树在创建和读取操作上表现出色,时间复杂度低且稳定。其有序性和平衡性使得查找路径短且高效,特别适用于数据库索引等需要频繁查找的场景。
  • 劣势:更新和删除操作可能涉及数据移动和树结构的调整,效率相对较低。特别是在数据频繁变更的场景下,B+树的调整工作可能会成为性能瓶颈。

因此,在使用B+树作为索引数据结构时,应根据业务需求选择适当的索引策略。例如,在需要频繁查找而更新和删除操作较少的场景下,B+树是一个很好的选择。而在数据频繁变更的场景下,可能需要考虑其他更适合的索引结构或优化策略。

什么是自适应哈希索引?

自适应哈希索引(Adaptive Hash Index,AHI)是一种用于快速访问数据库中数据的索引结构,它是InnoDB存储引擎中的一种特性。

定义与原理

自适应哈希索引将索引键值映射到哈希表中,以快速查找记录。InnoDB存储引擎会监控对表上索引页的查询,如果发现某个索引页被频繁访问,InnoDB就会为该索引页建立一个哈希索引。这个哈希索引是基于内存构建的,因此能够提供快速的查找速度。

优点

  • 快速查询:哈希表允许常数时间(O(1))的查找操作,因此自适应哈希索引能够快速地定位记录。
  • 低存储开销:哈希索引通常比B-tree索引更紧凑,因为它们不需要存储额外的指针和元数据。
  • 自动构建:InnoDB存储引擎会自动监控索引页的访问情况,并为频繁访问的索引页构建哈希索引,无需人工干预。

使用场景

自适应哈希索引主要适用于以下场景:

  • 等值查询频繁:如果某个列的值经常被用作等值查询的条件,并且查询频率较高,那么InnoDB存储引擎可能会为该列的值构建自适应哈希索引。
  • 热点数据访问:对于经常被访问的热点数据,自适应哈希索引能够提供更快的查找速度,从而提高查询性能。
  • 内存资源充足:由于自适应哈希索引是基于内存构建的,因此需要足够的内存资源来支持其构建和维护。

限制与注意事项

  • 只能用于等值查询:自适应哈希索引只能用于等值比较(如=、<=>、IN等),对于范围查询、模糊查询等不能使用哈希索引。
  • 占用内存资源:自适应哈希索引会占用InnoDB缓冲池的内存资源,因此需要根据实际负载情况来决定是否启用。
  • 无法人工干预:自适应哈希索引的构建和管理是由InnoDB存储引擎自动完成的,用户无法直接干预其构建过程。
  • LIKE运算符和%通配符的查询不会受益:对于使用LIKE运算符和%通配符的查询,自适应哈希索引无法提供加速效果。

监控与配置

  • 监控自适应哈希索引:可以通过SHOW ENGINE INNODB STATUS命令来监控自适应哈希索引的状态和性能。
  • 配置启用或禁用:可以通过设置innodb_adaptive_hash_index参数来启用或禁用自适应哈希索引。

什么是2-3树 2-3-4树?

多叉树(multiway
tree)允许每个节点可以有更多的数据项和更多的子节点。2-3树,2-3-4树就是多叉树,多叉树通过重新组织节点,减少节点数量,增加分叉,减少树的高度,能对二叉树进行优化。

2-3树

下面2-3树就是一颗多叉树

在这里插入图片描述2-3树具有如下特点:

  • 2-3树的所有叶子节点都在同一层。
  • 有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点。
  • 有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点。
  • 2-3树是由二节点和三节点构成的树。
  • 对于三节点的子树的值大小仍然遵守 BST 二叉排序树的规则。

在这里插入图片描述

2-3-4树

在这里插入图片描述

为什么官方建议使用自增长主键作为索引?(说一下自增主键和字符串类型主键的区别和影响)

官方建议使用自增长主键作为索引,这主要基于自增长主键在数据库性能和可维护性方面的多重优势。

自增长主键作为索引的优势

性能提升:

自增长主键通常是整数类型,这使得它们在数据库中的存储和索引效率非常高。整数类型的比较和排序速度通常更快,从而提高了查询、插入和更新操作的效率。
自增长主键的值按顺序递增,这有助于减小索引的尺寸。小尺寸的索引更容易缓存,从而进一步提高查询性能。

插入效率:

由于自增长主键的值是按顺序递增的,新的记录总是在表的末尾添加,这不会导致数据页的分裂或数据的重排。这种顺序插入的方式有助于提高插入性能。

避免主键冲突:

自增长主键是唯一的,因此不会出现主键冲突的情况,这有助于保持数据的完整性。

减小碎片化:

自增长主键有助于数据在磁盘上的有序存储,从而减小了碎片化,提高了磁盘读取性能。

容易管理:

自增长主键是数据库自动生成的,不需要应用程序手动分配主键值,这减轻了应用程序的负担。

适用于复制和分片:

在复制和分片环境下,自增长主键有助于数据的一致性和均匀分布。

自增主键与字符串类型主键的区别和影响

存储效率:

自增主键通常是整数类型,占用的存储空间较小。而字符串类型主键占用的存储空间相对较大,这会影响索引的存储效率和查询性能。

索引效率:

整数类型的自增主键在索引时效率更高,因为整数比较和排序的速度通常更快。而字符串类型的主键在索引时需要进行字符串比较,这可能会降低索引效率。

插入性能:

自增主键的顺序插入方式有助于提高插入性能。而字符串类型的主键在插入时可能会导致数据页的分裂或数据的重排,从而降低插入性能。

主键冲突:

自增主键是唯一的,不会出现主键冲突的情况。而字符串类型的主键在生成时如果不注意可能会产生重复值,导致主键冲突。

数据完整性:

自增主键的唯一性有助于保持数据的完整性。而字符串类型的主键如果处理不当可能会导致数据不完整或不一致的情况。

官方建议使用自增长主键作为索引主要是基于其在性能、插入效率、避免主键冲突、减小碎片化和易于管理等方面的优势。相比之下,字符串类型主键在存储效率、索引效率、插入性能和数据完整性方面可能表现较差。因此,在数据库表设计中,如果没有特别的需求,通常建议使用自增长主键作为索引。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自攻螺钉的世纪演变:探索关键设计与应用

自攻螺钉作为现代工业和建筑中的不可或缺的标准部件&#xff0c;经过了超过100年的发展和创新。从1914年最早的铁螺钉设计到今天的自钻自攻螺钉&#xff0c;自攻螺钉的设计不断优化&#xff0c;以适应更复杂的应用需求。本文将回顾自攻螺钉的演变历程&#xff0c;分析其设计原理…

【KMP算法】

目录 BF算法 KMP算法 BF算法 F算法&#xff0c;即暴力(Brute Force)算法&#xff0c;是普通的模式匹配算法&#xff0c;BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配&#xff0c;若相等&#xff0c;则继续比较S的第二个字符和 T的第二个字符&#xf…

快速学习Django框架以开发Web API

简介 Django是一个高级Python Web框架,它鼓励快速开发和简洁实用的设计。由经验丰富的开发者构建,Django可以为你处理大量的Web开发任务,使你能够专注于编写应用的关键组件。Django的模块化设计、可复用性和广泛的社区支持,使其成为开发Web应用和API的理想选择。 在本文中…

论文 | Evaluating the Robustness of Discrete Prompts

论文《Evaluating the Robustness of Discrete Prompts》深入探讨了离散提示&#xff08;Discrete Prompts&#xff09;的鲁棒性&#xff0c;即离散提示在自然语言处理任务中面对不同扰动时的表现。研究特别关注离散提示在自然语言推理&#xff08;NLI&#xff09;任务中的表现…

2024中国国际数字经济博览会:图为科技携明星产品引领数智化潮流

10月24日&#xff0c;全球数智化领域的目光齐聚于中国石家庄正定&#xff0c;一场关于数字经济未来的盛会—2024中国国际数字经济博览会在此拉开帷幕。 云边端算力底座的领航者&#xff0c;图为科技携其明星产品惊艳亮相&#xff0c;期待与您共赴一场数智化的非凡之旅&#xff…

7.2、实验二:被动接口和单播更新

源文件链接&#xff1a; 7.2、实验二&#xff1a;被动接口和单播更新: https://url02.ctfile.com/d/61945102-63671890-6af6ec?p2707 (访问密码: 2707) 一、被动接口 1.介绍 定义: 在路由协议的配置中&#xff0c;一个被动接口指的是一个接口不发送路由更新包的配置方式&a…

4.3 Linux的中断处理流程

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 原创不易&#xff0c;需要大家多多鼓励&#xff01;您的关注、点赞、收藏就是我的创作动力&#xff01; 4.3 Linux的中断处理流程 先上图&#xff0c;一图胜千言&#xff01; 图中心的蓝色部分&#xff0c;是L…

告别项目混乱,自定义工作项类型驱动项目管理进化

在项目管理中&#xff0c;工作项类型是用于分类和管理项目任务的基本构建块。如瀑布管理和敏捷管理&#xff0c;都有其特定的工作项类型来支持其独特的流程和实践&#xff1a; 敏捷管理的工作项类型 敏捷管理中的工作项类型强调迭代和增量开发&#xff0c;以用户故事为核心&a…

JAVA学习日记(十一) 常用API

一、Math //开平方根 public static double sqrt(double a); //返回结果 //开立方根 public static double cbrt(double a); 水题&#xff1a; public class Main {public static void main(String[] args) {//统计一共有多少个水仙花数 : abca^3b^3c^3abc// aabc/100%10//…

C++ 的异常处理详解

C 的异常处理详解 在编程过程中&#xff0c;错误和异常是不可避免的&#xff0c;合理的异常处理机制能够提高程序的健壮性。在 C 中&#xff0c;异常机制为捕获和处理错误提供了一种结构化的方式。本文将对 C 的异常处理进行详细探讨&#xff0c;包括异常的概念、如何抛出和捕…

IP协议知识点总结

IP协议主要分为三个 1. 地址管理 每个网络上的设备, 要能分配一个唯一的地址 2. 路由选择 小A 给小B 发消息, 具体应该走什么路线 3. 地址管理 IP 地址. 本质上是一个 32 位的整数 通常将, 32 位的整数使用点分十进制来表示, 如 192.168.1.1 一共可以表示 42 亿 9 千万个地址…

秒杀优化(异步秒杀,基于redis-stream实现消息队列)

目录 秒杀优化一&#xff1a;异步秒杀1&#xff1a;思路2&#xff1a;实现 二&#xff1a;redis实现消息队列1&#xff1a;什么是消息队列2&#xff1a;基于list结构实现消息队列3&#xff1a;基于pubsub实现消息队列4&#xff1a;基于stream实现消息队列5&#xff1a;stream的…

小新学习k8s第六天之pod详解

一、资源限制 Pod是k8s中的最小的资源管理组件&#xff0c;pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。k8s中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的StatefulSet和Deployment等…

Solana 代币 2022 — Transfer Hook

从零到英雄的 Solana 代币 2022 — Transfer Hook Token 2022 计划引入了几项令人兴奋的扩展&#xff0c;增强了铸造和代币账户的功能。在这些功能中&#xff0c;我个人最喜欢的是Transfer Hook &#xff08;转账钩子&#xff09; 。 想象时间 让我们戴上想象的帽子&#xf…

自定义类型:结构体(一)

一 . 结构体的相关概念 结构体&#xff0c;无需多言&#xff0c;是我们的老朋友了&#xff0c;我们之前就学习过一些有关结构体的知识&#xff0c;今天我们就来正式认识一下这个朋友 结构体属于一种自定义类型&#xff0c;在我们C语言中&#xff1a;自定义类型并非只有结构体…

使用匿名管道时出现程序一直运行问题

父进程创建两个子进程&#xff0c;父子进程之间利用管道进行通信。要求能显示父进程、子进程各自的信息&#xff0c;体现通信效果。(源程序pipe_1.c) 一开始&#xff0c;我忘了初始化pipe,很傻*的直接把fd当管道使&#xff0c;出现了儿子喊爸爸"i am your father."的…

协程4 --- 一个特殊的栈溢出例子

文章目录 代码运行结果分析 代码 先看下面这个程序流程&#xff1a; 有个长度位24的字符数组buffer&#xff0c;前面16个字符初始化。 把attack函数的地址复制到后面8个字符&#xff08;编译成64位程序&#xff0c;指针大小为8Byte&#xff09;。 打印信息&#xff1a;do Some…

C++用string实现字符串相加

. - 力扣&#xff08;LeetCode&#xff09; -》》》》》题目链接 实现思路&#xff1a;计算数字符串长度并用数组的方式计算出字符位置&#xff0c;用字符的ask码‘0’计算出字符本身。 class Solution { public:string addStrings(string num1, string num2) {string str;int…

03 Oracle进程秘籍:深度解析Oracle后台进程体系

文章目录 Oracle进程秘籍&#xff1a;深度解析Oracle后台进程体系一、Oracle后台进程概览1.1 DBWn&#xff08;Database Writer Process&#xff09;1.2 LGWR&#xff08;Log Writer Process&#xff09;1.3 SMON&#xff08;System Monitor Process&#xff09;1.4 PMON&#…

【大数据学习 | kafka高级部分】文件清除原理

2. 两种文件清除策略 kafka数据并不是为了做大量存储使用的&#xff0c;主要的功能是在流式计算中进行数据的流转&#xff0c;所以kafka中的数据并不做长期存储&#xff0c;默认存储时间为7天 那么问题来了&#xff0c;kafka中的数据是如何进行删除的呢&#xff1f; 在Kafka…