面试官:MySQL 为什么用 B+ 树实现索引

【面试题】MySQL索引相关的面试题(红黑树,hash,B树,B+树) 自己整理了几个面试题分享给大家 问题1:红黑树为什么那样设计? 首先聊一下二叉搜索树,主要特点是左节点比根节点小,右节点比根节点大,并且左右子树都是二叉搜索树。缺点是在极端情况下,比如插入都是有序的,就会出现退化的情况有序序列树退化成链表。 二叉搜索树 退化成链表的二叉搜索树 此时,要想让树的节点平均分布就需要平衡树了,红黑树就是平衡树的一种(平衡二叉搜索树)。然后,一棵树的查询性能取决... 阅读详情

索引对大家来说肯定不会陌生,不管是日常的开发还是面试中,都少不了索引的身影。

我们都会使用索引,但是我们对于索引的原理却是一知半解。本文就带大家深入学习一下 MySQL 的索引模型。

索引概述

关于索引的定义,百度百科给出的解释是:

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

简单来说,索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。

常见的索引模型

通过前面,我们了解到,索引的本质是一种排好序的数据结构。其作用是为了提高数据查询的效率。

可以用于提高读写效率的数据结构很多,这里先介绍三种常见也比较简单的数据结构,它们分别是:哈希表、有序数组和二叉搜索树。

下面主要从使用的角度,简单分析一下三种模型的区别。

哈希表

哈希表(又称散列表),是一种以键-值(key-value)存储数据的结构,我们只要输入待查找的键即 key,就可以找到其对应的值即 value。

哈希的底层是通过数组来保存值的,通过一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。

也就是说,通过映射函数(f(key))将每一个关键码值都映射到哈希表中一个位置,通过关键码值来访问数据,以加快查找的速度(即O(n))。

这个映射函数叫做散列函数,存放记录的数组叫做散列表。

不可避免的,多个 key 值经过哈希函数的换算,会出现同一个值得情况。即 f(key1)= f(key2) 且 key1 ≠ key2,对于这种情况称为哈希冲突,也叫哈希碰撞。

处理这种情况的一种方法是,拉出一个链表也叫拉链法。

假设,现在有一个维护着身份证信息和姓名的表,需要根据身份证号查找对应的名字,这时对应的哈希索引的示意图如下所示:

在这里插入图片描述

图中,User2 和 User4 根据身份证号算出来的值都是 N,但没关系,后面还跟了一个链表。

这时候查 ID_card_n2 对应的名字是什么,处理步骤如下:

  1. 首先,将 ID_card_n2 通过哈希函数算出 N;
  2. 然后,按顺序遍历,找到 User2。

需要注意的是,图中 ID_card_n 的值并不是递增的,这样做的好处是增加新的 User 时速度会很快,只需要往后追加。

但缺点是,因为不是有序的,所以哈希索引做区间查询的速度是很慢的。

如果现在要找身份证号在[ID_card_X, ID_card_Y]这个区间的所有用户,就必须全部扫描一遍了。

所以,哈希表这种结构适用于只有等值查询的场景,比如 Memcached 及其它一些 NoSQL 引擎。

有序数组

而有序数组在等值查询和范围查询场景中的性能都非常优秀。

还是上面这个根据身份证号查名字的例子,如果我们使用有序数组来实现的话,示意图如下所示:

在这里插入图片描述

这里假设身份证号没有重复,这个数组就是按照身份证号递增的顺序保存的。

这时候如果要查 ID_card_n2 对应的名字,用二分法就可以快速得到,这个时间复杂度是 O(log(N))。

对于一个有序数组,对范围查找也十分友好,只需要找到起始元素即可。如果在知道元素下标的情况下,更新操作也非常快,对于删除操作,如果我们不考虑空洞的话(如果直接将对应下标处的元素置为 null,这样这块连续内存块中相当于有个空洞),删除操作也很快。

这么一分析,数组对查询、删除、更新操作的效率非常高,选数组作为 MySQL 索引的数据结构看起来似乎不错。

然而我们忽略了还有「插入操作」,如果我们要往数组中间插入一个数据,就必须得挪动后面所有的记录,要插入的数据越靠前,那么我们需要复制的数据就越多,成本太高。

所以,有序数组索引只适用于静态存储引擎,比如保存的是 2021 年某个城市的所有人口信息,这类不会再修改的数据。

因此,从插入数据这一角度来看,数组不太适合作为 MySQL 索引的数据结构。

二叉查找树

二叉查找树(Binary Search Tree),也称为二叉搜索树、有序二叉树(Ordered Binary Tree)或排序二叉树(Sorted Binary Tree),是指一棵空树或者具有下列性质的二叉树:

  • 若任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值
  • 若任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值
  • 任意节点的左、右子树也分别为二叉查找树
  • 没有键值相等的节点

知识点:任意非空二叉查找树,左子节点值 < 根节点值;根节点值 < 右子节点值

在这里插入图片描述

二叉查找树的查找操作

在二叉查找树中查找 N :

  1. 首先从根节点开始,将根节点设置为当前节点,
  2. 若当前节点为空,则查找失败,
  3. 若 N 与当前节点值相等,返回当前节点,
  4. 若 N 大于当前节点值,则从当前节点的右子节点开始查找,否则从当前节点的左子节点开始查找,
  5. 直到返回目标节点或者查找失败。

对于二叉搜索树而言,它的查找操作的时间复杂度就是树的高度,最理想的情况下,也就是满二叉树的情况下,查找的时间复杂度为 O(logn)。

满二叉树:除最后一层无任何子节点外,每一层上的所有节点都有两个子节点的二叉树。

还是上面的例子,如果我们用二叉搜索树来实现的话,示意图如下所示:

如下图,要查 ID_card_n2 的话,按照图中的搜索顺序就是按照 UserA -> UserC -> UserF -> User2 这个路径得到,这个时间复杂度是 O(log(N))。

在这里插入图片描述

二叉查找树的缺陷

当我们在不停地动态地往树中插入数据、删除数据时,在极端情况下,二叉搜索树可能退化成链表,它的查找时间复杂度就变成了 O(n),性能不够稳定。如下图:

在这里插入图片描述

为了维持O(log(N)) 的查询复杂度,就需要保持这棵树是平衡二叉树(AVL 树)。

平衡树是在二叉查找树的基础上,增加了一条限制,左右两个子树的高度差不能超过 1,左右两边相对平衡,因此称之为平衡树。

但是平衡二叉树在数据动态地删除、插入地过程中,为了维护平衡,避免树退化成链表,因此需要在删除或者插入数据后进行额外的旋转操作,会损耗一定的性能。

但整体来讲,它的查找、删除、插入、更新的复杂度均为O(log(N)) 。它的中序遍历,数据是有序的,因此也适合范围查找。但是它的缺点是,为了维护平衡,它的旋转操作过于复杂。

在平衡二叉树的基础上又出现了红黑树。

简单来说,红黑树是一种近似平衡(不完全平衡),节点非黑即红的树,它的树高最高不会超过 2log(n+1),因此查找的时间复杂度为 O(logn),无论是增删改查,它的性能都十分稳定。

工程上,很多地方都使用的是红黑树这种数据结构,例如 Java 中的 HashMap等。

为什么索引不用二叉树实现

无论二叉搜索树,还是 AVL 树,亦或是红黑树,它们都是二叉树的一种。

特点都是每个节点最多只有两个子节点,如果存储大量数据的话,那么树的高度会非常高。

二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树,其原因是,磁盘 IO。

MySQL 数据库的索引是存储在磁盘的。当数据量比较大的时候,索引的大小可能有几个 G,甚至更多。

当我们利用索引查询的时候,肯定不能全部加载到磁盘中的。能做的只有逐一加载磁盘页,这里的磁盘页对应的就是树的节点。如下图:

在这里插入图片描述

如果树太高,每遍历一层节点时,就需要从磁盘读取一次数据,也就是发生一次 IO,如果数据在树高为 20 的地方,那查找一次数据就得发生 20 次 IO,如果树再高呢,这对应用程序简直就是灾难性的,耗时太长了。

因此二叉树在 MySQL 这种需要存储大量数据的场景下,是不适合当做索引的数据结构的,因为树太高,操作数据时会发生多次磁盘 IO,性能太差。

为了让一个查询尽量少地读取磁盘,就必须让查询过程访问尽量少的数据块。

树可以有二叉,也可以有多叉。多叉树就是每个节点有多个子节点,子节点之间的大小保证从左到右递增。

那么我们就不应该使用二叉树,而是要使用「N叉」树,这里「N叉」树中的 N 取决于数据块的大小。

N 叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了。

在 MySQL 中,索引是在存储引擎层实现的(事务也是引擎层面实现的),所以并没有统一的索引标准,即不同存储引擎的索引的工作方式并不一样。

而即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。

由于 InnoDB 存储引擎在 MySQL 数据库中使用最为广泛,所以下面就以 InnoDB 为例,分析一下其中的索引模型。

InnoDB 的索引模型

在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。

InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。每一个索引在 InnoDB 里面对应一颗 B+ 树。

分析 B+ 树之前,我们先了解一下 B 树。

B 树

B 树(B-tree),有翻译成「B减树」的,其实是错误的,中间的横线不是减号。可能因为 B+树所以会导致这样的误解,实际上并没有 「B减树」 这个概念。

B 树是一种多路平衡查找树,它的每一个节点最多包含 k 个孩子,k 就是 B树的阶。k的大小取决于磁盘页的大小。

阶数 表示 此树的节点 最多 有多少个孩子节点(子树),一般用字母 M 表示阶数。

一棵 m阶 的 B 树的特性如下:

  1. 如果根节点不是叶子节点,那么它至少有两个子节点;
  2. 每一个中间节点(非叶子节点,非根节点)最多有 m 个子节点;
  3. 每一个中间节点最少有ceil(m/2)个子节点;
  4. 有 k 个子节点的非叶子节点拥有 k − 1 个元素,其中 m/2 <= k <= m;
  5. 所有的叶子节点都在同一层;
  6. 每个节点中的元素从小到大排列,节点当中 k-1 个元素正好是 k 个孩子包含的元素的值域分划。

在这里插入图片描述

如上图所示:

  1. 这是一棵 3 阶 的 B树。
  2. 根节点有两个孩子 (2 6) 和 12;
  3. 我们来看 (2 6)节点,该节点有两个元素 2 和 6,有三个孩子:1、(3 5)、8;其中 1 小于 元素 2,8 大于 3、5。

B 树把树的节点关键字增多后,树的层级比原来二叉树的层级少了,这样就可以减少数据查找的次数,也就是减少了 IO 次数,提高了查询性能。

B 树存在的问题

B 树相比二叉树虽好,但还是存在以下问题:

  • 每个节点中既要存索引信息,又要存其对应的数据,如果数据很大,那么当树的体量很大时,每次读到内存中的树的信息就会不太够。
  • B 树遍历整个树的过程和二叉树本质上是一样的,B 树相对二叉树虽然提高了磁盘 IO 性能,但并没有解决遍历元素效率低下的问题。

针对以上两个问题,B+ 树诞生了。

B+ 树

B+ 树和 B 树类似,但多了几条规则。

一棵 m 阶的 B+树具有如下几个特征:

  1. 有 k 个子树的中间节点包含有 k 个元素(B树中是 k-1 个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
  2. 所有的叶子节点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子节点本身依关键字的大小自小而大顺序链接。
  3. 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

在这里插入图片描述
解释一下:

首先,每一个父节点的元素都出现在子节点中,是子节点最大(最小的元素)。

比如 8 和 15:

在这里插入图片描述

根节点中最大的元素,同时也是整树最大的元素,以后无论插入多少数据,始终要保证最大元素在根节点中。

至于叶子节点,由于父节点的元素都出现在子节点,因此所有叶子节点包含了全量的元素信息。并且每一个叶子节点,都带有指向下一个节点的指针,形成了一个有序链表。

B 树 和 B+ 树 的区别

1、卫星数据的位置不同:卫星数据指的是索引元素指向的记录。比如数据库中的某一行。在B 树中,无论是中间节点还是叶子节点都带有卫星数据。

在这里插入图片描述

而在 B+ 树中,只有叶子节点带有卫星数据,其余中间节点仅仅是索引,没有任何数据关联。

这样,整个树的每个节点所占的内存空间就变小了,读到内存中的索引信息就会更多一些,相当于减少了磁盘 IO 次数。

在这里插入图片描述

需要补充的是,在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。

2、B+ 树的范围查询更加方便:由 B 树的性质可以得到,所有叶子节点都会在同一层,B+树会以一个链表的形式将所有叶子节点的信息全部串联起来。

B+ 树叶子节点两两相连可大大增加区间访问性,可使用在范围查询等,而 B 树每个节点 key 和 data 在一起,则无法区间查找。

总结

本文我们分析了几个常见的索引模型:

  • 哈希表:适用于等值查询,缺点是区间查询效率慢;
  • 有序数组:数组对查询(等值查询、区间查询)、删除、更新操作的效率非常高,但是对于插入操作效率低下,原因是涉及元素后移;
  • 二叉搜索树:极端情况下,二叉搜索树可能退化成链表,性能不够稳定。

我们又分析了 B 树 和 B+ 树的区别,以及为什么要用 B+ 树作为 MySQL 索引的数据结构。

主要是因为 B+ 树中只有叶子节点才会存放索引值和数据,非叶子节点只会存放索引值。

因此对于非叶子节点,一个节点中,B+ 树存放的索引值数量会远远大于 B 树(因为一个节点的空间是有限的,B 树要存放索引+数据,而 B+ 树只需要存放索引)。这样就导致了每个节点中,B+ 树能向下分出更多的叉,子节点数更多。

那么在要存储同样大小的数据文件的场景下,用 B+ 树存储,最终树的高度会远远小于用 B 树存储的高度。

所以使用 B+ 树作为 MySQL 索引的数据结构,将来在读取数据时,发生的磁盘 IO 次数会更少,性能更优,因此最终 MySQL 索引的数据结构使用的是 B+ 树。

大厂面试官问我:Mysql B+树索引中B最后一层是双向链表还是单向链表?为什么这么设计?【后端八股文十四:Mysql索引八股文合集】 范围查询效率高:由于叶子节点之间有指针连接,可以通过顺序遍历叶子节点获取范围内的数据记录,避免了不必要的磁盘访问和索引的跳转。顺序访问优化:当进行顺序访问时,B+树可以通过双向链表进行高效的顺序遍历,减少磁盘IO次数,提高访问性能。如果 SQL 语句中用到了组合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个组合索引去进行匹配。当遇到范围查询(betweenlike)就会停止匹配,后面的字段不会用到索引。例子:对(a,b,c,d)建立索引,查询条件为。 阅读详情

相关推荐

MySQL面试系列:索引数据结构为什么不用B树、二叉树、哈希表?(四)

前言 面试官:MySQL索引的存储结构是什么? 面试者:是B+树。 面试官:为什么不是B树、二叉树、哈希表? 面试者:%……&(&……(懵逼中) 面试官:MySQL有哪几种索引? 面试者:主键索引、唯一索引、联合索引、普通索引。 面试官:什么是聚簇索引、非聚簇索引、覆盖索引、索引下推、最左原则? 面试者:%……&(&……(懵逼中) 接下来我们就通过了解B+树去全面解...

Oooo_mumuxi的博客 2244

面试mysql索引原理_面试常问-数据库索引实现原理

知识内容:1.数据库数据储存2.数据库索引实现一、数据库数据存储1.数据库中数据存储形式数据库中的数据均是存储在数据表中,每个数据库由不同的数据表构成,不同的表存储着不同的数据,这里以用户表为例一个简单的用户表结构如下:2.数据库表结构模拟上述中的用户表用python语法结构可以简化为以下结构:1 [2 {3 "id": 1,4 "username": wyb,5 ...

weixin_29282577的博客 291

面试官:MySQL为什么选择B+树作为索引结构

最后,总结一下各种树解决的问题以及面临的新问题:二叉查找树(BST):解决了排序的基本问题,但是由于无法保证平衡,可能退化为链表;平衡二叉树(AVL):通过旋转解决了平衡的问题,但是旋转操作效率太低;红黑树:通过舍弃严格的平衡和引入红黑节点,解决了AVL旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO次数太多;B树:通过将二叉树改为多路平衡查找树,解决了树过高的问题;B+树:在B树的基础上,将非叶节点改造为不存储数据的纯索引节点,进一步降低了树的高度;

m0_71777195的博客 645

MySQL人人都会用索引,原理你知道吗,面试总结+详细解答

其实,索引就是一种优化查询的数据结构,MySQL中的索引就是用B+树实现的。那么为什么MySQL会选择B+树作为索引的实现数据结构呢?它和哈希表、完全平衡二叉树、B树有什么不同? 假设,我们现在有下面的user表: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iSEwfKU2-1630672244446)(//upload-images.jianshu.io/upload_images/12320828-4b074ea15427404c.png?imageMogr2/aut

m0_61417954的博客 231

【五斗米】计算机数据结构

有了二叉树为什么要出现多叉树? 因为二叉树【每个结点最多有两个子结点】在大规模的数据存储中,树会高的没谱,这会导致IO读写过于频繁,查询效率低下 多叉树【每个结点可以有多个子结点】可以解决这个问题,它每层可以存放更多的数据,因此能大幅度降低树的深度,提高查询性能.................................

m0_64210833的博客 1357

MySQL高频基本面试问题整理

总结大厂MySQL高频基本面试问题整理,用于快速查缺补漏

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 175万+

面试官:MySQL 中 InnoDB 的索引结构以及使用 B+ 树实现索引的原因

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 10分钟。来自:guobinhit.blog.csdn.net/article/details/106221933在 MySQL 的众多存储引擎中,InnoDB 是最常用的存储引擎,也是 MySQL 现阶段唯一免费支持事务机制的存储引擎。在本文中,我们以 InnoDB 为例,介绍 MySQL 的索引结构以及其使用 B+ 树实现...

良月柒 493

面试官:MySQL索引为什么要用B+树实现?

假设通过你的评估,你表里的一行数据(包含所有字段)大小为 RowSize(例如 1 KB,即 1024 字节)。因为非叶子节点变轻量了,一个16KB的节点能容纳更多的索引,进一步降低了树的高度。B树:每个节点不仅存“索引键”(Key),还存“整行数据”(Value)。这就导致每个节点占用的空间很大,一页磁盘(默认16KB)能存的索引数量变少,树会变高。B树:进行范围查询(比如 WHERE age BETWEEN 18 AND 30)时,需要不停地在子节点和父节点之间“来回倒腾”(中序遍历),极其低效。

小识的博客 1万+

查找树的指定层级_面试官:MySQL索引为什么要用B+树实现?

前言在从一堆数据中查找指定的数据时,我们常用的数据结构是哈希表和二叉查找树,表本质上就是一堆数据的集合,所以MySQL数据库用了B+树和哈希表来实现索引B+树是通过二叉查找树,再由平衡二叉树,B树(又名B-树)演化而来的,B+树中的B不是代表二叉(binary),而是代表平衡(balance),因为B+树是从最早的平衡二叉树演化而来,但是B+树不是一个二叉树二叉查找树和平衡二叉树二叉查找树的效率和...

weixin_27032989的博客 171

Microapp 接入vite子应用

MicroApp接入vite版本,干货满满,手把手步骤说明,加上报错说明,赶紧上车!

outsider76557的博客 4655

TensorRT-LLM环境配置避坑指南:从安装到实战

本文是一份详尽的TensorRT-LLM环境配置避坑指南。文章重点解析了从Python、CUDA、PyTorch版本选择,到解决mpi4py安装这一核心难题的完整流程,并提供了经过验证的稳定版本组合与实战排错方案,帮助开发者高效部署大语言模型推理优化环境。

a0b1c2d3的专栏 973

150道MySQL高频面试题,学完吊打面试官--InnoDB索引与MyISAM索引实现的区别+一个表中如果没有创建索引,那么会创建B+树吗

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

小白的大数据之旅的博客 1156

影刀RPA进阶:Excel多条件筛选与数据提取实战

本文详细介绍了如何利用影刀RPA实现Excel多条件筛选与数据提取的自动化。通过拆解文本、数值、日期及颜色筛选等核心指令,并结合实战案例,指导用户构建稳健的销售数据提取机器人,从而高效处理复杂数据报表,提升工作效率。

onion的博客 517

150道MySQL高频面试题,学完吊打面试官--B+树索引实现原理(数据结构)

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

小白的大数据之旅的博客 881

PCIe扫盲(三)

需要特别注意的是,PCIe的Spec中明确规定只有Root有权限发起配置请求(Originate Configuration Requests),也就是说PCIe系统里面的其他设备是不允许去配置其他设备的配置空间的,即peer-to-peer的配置请求是不允许的。当配置请求进行BDF路由的时候,正是依靠这些信息来确定要找的设备的。前面的文章还介绍过,Root和Switch的每一个端口中都包含一个P2P桥,并且知道桥的配置空间头(Configuration Space Header)是Type1型的。

Liuqz2009的专栏 2384

备战数学建模38-粒子群算法pso番外篇1(攻坚战2)

粒子群算法最初是根据鸟类群体行为得到的启发,对鸟群行为进行仿真的算法,是一种启发式算法,也就是智能优化算法,利用信息共享,通过中间信息进行改进搜索,从而获得问题的可行解。我们简单从下图去体会一下粒子群算法,就是有多个鸟,每个鸟相当于一个粒子,每只鸟的位置受自己认知的历史最佳位置和当前距离食物最近的鸟的位置的影响。我们进一步分析这个图,可以得到两个公式,第一个是速度公式,即每只鸟的当前速度受上一步的速度惯性,自我认知和社会认知三部分影响,第二个是位置公式,即每只鸟的位置受上一位置和上一位置的速度的影响。

nuist_NJUPT的博客 1661

华为OD面试MySQL高频考点全解析:从手写SQL到索引事务

在数据库技术体系中,MySQL 索引与事务机制是保障系统高性能与数据一致性的基石。B+树索引结构决定了查询效率,而事务隔离级别与锁机制则直接影响并发场景下的稳定表现。理解索引失效的典型场景、MVCC多版本控制原理以及死锁排查方法,是进行 SQL 优化的关键。在实际工程中,无论是千万级数据分页,还是高并发订单更新,都需要借助 EXPLAIN 执行计划定位慢查询,并通过合理设计联合索引与隔离级别来规避性能瓶颈。针对华为OD技术面试中 MySQL 的考察逻辑,系统梳理了手写 SQL、索引优化、事务与锁、存储过程等

weixin_29256771的博客 313

【原创】关于西门子S120 的电气图纸设计

我们首先要了解一下模块的基本信息:SINAMICS 功率模块 PM240-2 三相交流380-480V+10/-10% 47-63Hz;至此,我们选择的驱动系统配置的资料都已经查找完毕,接下来就是根据每个部件的功能接口和我们需要实现的功能画出接线连接图,这样关于伺服电机控制,硬件部分设计就完成了。2)FSA - FSC 型功率模块 PM240-2 的屏蔽连接板外形尺寸图,所有数据以毫米(英寸)为单位。1)FSA 型功率模块 PM240-2 的外形尺寸图,所有数据以毫米(英寸)为单位。

Qinmingyue13的博客 2632

为什么MySql索引使用B+树

前言 面试中我们经常碰到面试官问到数据库索引,问到索引就会问你索引的数据结构。类似这种数据结构对于普通程序员来说记住概念几天就忘了,而且概念不是每个人都能很好都理解,所以针对这一原因,我简单通俗都像大家讲解为什么mysql使用都是B+树,而不用其他的树形结构。 正文 Q1:B+树的查询时间大概多少? A:跟树的高度有关,是O(log n)。 Q2:hash查找时间大概多少? A:o(1...

晏霖/胖虎的博客 1万+

1.嵌入式控制器EC学习,编译环境搭建

工欲善其事,必先利其器。 在学习EC相关知识之前,首先需要完成EC代码编译环境的搭建,需要如下内容: Keil C51(用于EC中C代码的编译器环境) EC源代码,我们使用从网上可以下载到的 ITE_V12.4_Update 版的代码为例进行学习 代码编辑器,这个可以根据自己的习惯选择,VS Code或者Source Insight等 Keil C51下载地址: http://www.downcc.com/soft/307131.html 下载完成后请进行破解 EC源代码 ...

qq_30135687的博客 3911

【STK】手把手教你利用STK进行覆盖分析02-生成详细分析报告和图表

这篇文章主要针对上一篇文章中最后的案例1进行进一步的说明,详细介绍我们可以生成哪些结论性的成果。STK的Coverage模块的生成结果包括分析报告和图表两种样式,每种样式还分为动态和静态两种,也就是说,我们做完一个STK覆盖场景的仿真后,一般可以生成静态分析报告、动态分析报告、静态分析图表和动态分析图表这4种形式的分析成果,下面进行详细介绍。我们在选择了想要分析的区域或者点后,就可以利用CovDef生成分析报告了,覆盖定义的分析报告分为静态报告和动态报告两种,下面分析进行介绍: 首先我们先在左侧目标浏览器C

weixin_44184852的博客 3437

为什么Mongodb索引用B树,而Mysql用B+树?

引言好久没写文章了,今天回来重操旧业。今天讲的这个主题,是《面试官:谈谈你对mysql索引的认识》,里头提到的一个坑。也就是说,如果面试官问的是,为什么Mysql中Innodb的索引结构...

孤独烟 3988

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

面试官:为什么MySQL的索引要使用B+树,而不是其它树?比如B树?

InnoDB的一棵B+树可以存放多少行数据? 答案:约2千万 为什么是这么多? 因为这是可以算出来的,要搞清楚这个问题,先从InnoDB索引数据结构、数据组织方式说起。 计算机在存储数据的时候,有最小存储单元,这就好比现金的流通最小单位是一毛。 在计算机中,磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)的最小单元是块,一个块的大小是4k,而对于InnoDB存储引擎也有自己的最小储存单元,页(Page),一个页的大小是16K。 下面几张图可以理解最小存储单元: 文件

2396

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 一文读懂 MySQL 事务隔离机制
下一篇: 二叉树基础知识
程序员徐述
博客等级 码龄8年 1015粉丝 104原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值