MySQL面试题-索引的基本原理及相关面试题
先了解一下MySQL的结构
下面我们重点讲一下存储引擎
MySQL的数据库和存储数据的目录是一一对应的,这些数据库的文件就保存在磁盘中对应的目录里
下面我们来看一下对应的具体数据文件
.frm是表的结构,不管什么样的索引都会有
.ibd代表我们现在使用的存储引擎是InnoDB,ibd里面既有数据又有索引
下面我们把prodct_cn这个表的存储引擎改为MyIsam
我们可以看到原来的ibd标成了现在的MYD和MYI, MYD是表的数据文件, MYI是表的索引文件
Mysql的索引是以数据结构为载体,以文件的形式落地的。
不管是MyISAM还是InnoDB存储引擎,内部使用的数据结构都是以B+树为载体的
B-Tree叫做B树,不是B减树
一次查询数据库的过程主要涉及到三个计算机的硬件:硬盘、内存、CPU
大概过程是把硬盘中的数据读取到内存中(树的根节点本身是缓存在内存里的),然后CPU从内存中读取数据进行计算,我们简单演示一下从0001-0010这棵树查找0007的过程
1.第一步先从磁盘读取根节点0004(实际上已经缓存了),这是第一次磁盘IO的过程,判断0007比根节点大,往右侧进行寻址
2.CPU进行调度把0006、0008这节点从磁盘读取到内存里,这是第二次磁盘IO的过程CPU从内存读取数据进行判断,发现0007大于0006但是小于0008,所以往二者之间的分支进行寻址
3.CPU进行调度把0007这个节点从磁盘中读取到内存中,CPU从内存中读取数据发现与查找目标一致,查询结束,这是第三次磁盘IO的过程。
根据冯诺依曼的计算机模型三种硬件的速度是这样的:磁盘<内存<CPU
磁盘是最慢的,所以我们要努力减少磁盘的IO
Mysql进行磁盘读取的时候不会只读取一个节点,而是会按照以数据页为最小单位(最小数据交互单元)进行读取(Windows的数据页为4k,MySQL的数据页为16k)。
数据页我们把他想象为一个个的格子,每次都要读取一个格子的数据,如果要读取的数据不到一个格子,则读取一个格子,超过一个格子小于2个格子,读取两个格子,以此类推。
好比我们有一个衣柜,原来是所有的东西都放在里面,找起来特别麻烦,然后呢产生了文件系统的概念(打成了一个个的格子),按照格子进行分类,每个给子的大小就是数据页的大小
mysql的数据页是16kb,比如我们刚才查找0007的过程,整个过程共读取了3个数据页,也就是48kb,这是单人单次查询的磁盘IO消耗
下面我们看一下B树的数据结构,每一个节点的大小(磁盘块大小)是固定的16kb,对于B树来说,这16kb的空间用来放三类数据:指针*(子节点的寻址地址,占用少量空间)、索引列的数据(比如id,占用的空间比较少)、数据(图中data的部分,这部分是特别耗空间的)。因为大小是固定的16kb,所以单条数据占用的空间越小,则磁盘块可以放的数据条数越多,比如如果单条数据是1kb,那一个磁盘块只能放16条数据,而如果是1b就可以放16000条数据,也就是存储同样数量的数据,如果单条数据越小,则需要的磁盘块(节点)越少,也就是基于同样的Max.Degree,树的高度会降低
由此我们有了更适合做索引的B+树
它与B树的最主要的区别在于:
B树每个节点都放了数据,而B+树只有叶子节点放了数据,其他的层的数据都只有指针和原始的索引列的值
相关面试题:为什么mysql单表最大2000万?依据是啥
参加小白debug的文章:
为什么大家说mysql数据库单表最大两千万?依据是啥? - 掘金
时间充足理解能力强的建议看原文,我这里把本面试题的重点解释一下
图中X, Y, Z的含义如下
X :非叶子节点内指向其他内存页的指针数量(B+树和B树数据结构中的Max.Degree)
Y :叶子节点能容纳的记录的数量
Z: B+树的层数
因为B+树只有叶子节点能存放数据,我们这里要先算一下叶子节点的数量
大家都学过最简单的树的数据结构:二叉树(特殊的多叉树,Max.Degree为2),Z层二叉树的节点数量是2^(Z-1)
图中的B+树叶子节点的数量应该是X^(Z-1)个,然后每个叶子节点(页)能放Y条数据,由此我们得出这棵B+树最多能放X^(Z-1)*Y条记录。
因为Mysql的页大小16kb,我们页头页尾那部分数据全加起来大概128Byte
,加上页目录毛估占1k左右吧,也就是只有15k左右可以用来放数据(索引列的值)和指针,这里假设索引列是bigint类型(占8Byte),然后页号(指向前后页的指针)在源码中叫做FIL_PAGE_OFFSET(4Byte),二者大概是1:1的关系,相当于每条索引占用12Byte左右的空间,所以非叶子节点每页可以容纳15KByte/12Byte=1280条数据(图中的X),如果是3层B+树那图中的Z就是3.
那刚才的公式就是1280^(3-1)*Y
现在我们评估一下Y,对于叶子节点来说,每个页的大小也是16kb,但是叶子节点放的是真正的数据,占的空间会比较大一些,假设每一条数据1kb,那每个页只能放15条数据(我们页头页尾那部分数据全加起来大概128Byte
,加上页目录毛估占1k),然后我们把Y=15代入上面的公式,可以得到3层的B+树可以放的数据记录的条数为1280^*(3-1)*15 = 24576000,这个可能就是我们平时传言的超过2000万要分库分表的依据。
但是这个不是绝对的,比如我们刚才评估每条数据占1kb,那如果数据比较简单,每条数据只需要200b呢,那刚才的3层B+树就可以容纳1.25亿条数据。
mysql的查询速度主要取决于B+树的高度(因为只有叶子节点有数据,所以一定要经历树的高度次IO,这里与B树不同,B树最少1次,最多树的高度次),所以具体可以容纳多少条数据而不影响性能需要根据具体的数据来分析。
如果面试聊到这里,怕是接着就要聊分库分表了
相关文章:

MySQL面试题-索引的基本原理及相关面试题
先了解一下MySQL的结构 下面我们重点讲一下存储引擎 MySQL的数据库和存储数据的目录是一一对应的,这些数据库的文件就保存在磁盘中对应的目录里 下面我们来看一下对应的具体数据文件 .frm是表的结构,不管什么样的索引都会有 .ibd代表我们现在使用的存…...

MySQL学习笔记19
MySQL日志文件:MySQL中我们需要了解哪些日志? 常见日志文件: 我们需要掌握错误日志、二进制日志、中继日志、慢查询日志。 错误日志: 作用:存放数据库的启动、停止和运行时的错误信息。 场景:用于数据库的…...

为什么u盘在mac上显示不出来
插入U盘是个看似简单的操作,但有时候在Mac电脑上却出现了无法显示U盘的情况。这样的问题是非常让人头疼的,特别是当你急需使用U盘中的文件时。那么,究竟为什么U盘在Mac上会显示不出来呢?今天就让我们一起来深入了解一下这个问题&a…...

【golang】调度系列之sysmon
调度系列 调度系列之goroutine 调度系列之m 调度系列之p 在golang的调度体系中,除了GMP本身,还有另外一个比较重要的角色sysmon。实际上,除了GMP和sysmon,runtime中还有一个全局的调度器对象。但该对象只是维护一些全局的数据&…...

货物寄到英国选择什么物流比较划算?
随着全球化的发展,越来越多的企业开始将产品销售到海外市场,其中英国作为一个重要的贸易伙伴,吸引了大量的中国企业的关注。然而,如何将货物安全、快速地运送到英国,成为了众多企业面临的一个问题。那么,货…...
vite + react 基本项目搭建
新建项目步骤略过 1、下载scss 无需任何配置就可以直接使用scss了 pnpm install sass使用scss配置全局颜色变量 新建/src/styles/variable.scss并在 $primary: #76aef9在vite.cinfig.js里配置 export default defineConfig({css: {preprocessorOptions: {scss: {javascrip…...
一个方法解决三道区间问题
1288. 删除被覆盖区间 56. 合并区间 986. 区间列表的交集 # 1288. 删除被覆盖区间 class Solution:def removeCoveredIntervals(self, intervals: List[List[int]]) -> int:# 按照起点升序排列,起点相同时,按照终点降序排列intervals.sort(key lamb…...

sub0 里斯本精彩回顾:探索波卡区块的创新空间
sub0 Europe 2023 已在葡萄牙里斯本圆满结束!sub0 大会是波卡生态开发者大会,由波卡协议的主要开发方 Parity Technologies 举办的开发者大会,汇聚了全球 Substrate 开发者和学习者,旨在为 Polkadot 和 Kusama 生态的开发者、贡献…...

颜色+情感的英语表达还有这些,零基础学英语口语去哪里,柯桥有推荐的吗?
当我们探讨关于"blue"(蓝色)的多义性时,我们会发现英语中有许多其他词汇也有类似的双关意义。 既可以表示一种颜色或物理属性,又可以代表一种情感或心理状态。 这种现象在语言中很常见,反映了语言的丰富性和…...
exoplayer的使用-6,播放器的选择
需要一个能播放蓝光的,高码率的播放器,在使用现成的播放器的基础上,可选的有几个,exoplayer,vlc,ijk,mpv. exoplayer的更新频繁,适应性强,扩展性一般,因为它基于系统的硬解,音频可扩展,使用ffmpeg可以解决. 有国际化支持,音频,字幕这些显示效果好. 对杜比视频,hdr这些支持看设…...

Windows上安装 Go 环境
一、下载go环境 下载go环境:Go下载官网链接找到自己想下载的版本,点击下载,比如我这是windows64位的,我就直接点击最新的。 二、安装go环境 双击下载的.msi文件 next next 他默认的是c盘,你自己可以改,然…...

【设计模式】四、工厂模式
文章目录 概述工厂模式简单工厂模式:工厂方法模式抽象工厂模式小结 概述工厂模式 传统方式: 简单工厂模式: 简单工厂模式的设计方案: 定义一个可以实例化 Pizaa 对象的类,封装创建对象的代码。 存在的问题: 简单工厂…...

十九,镜面IBL--BRDF积分贴图
再回顾下镜面部分的分割求和近似法 现在关注第二部分 最后可化为 也就是说,这两部分积分可以获得F0的系数和F0的偏差。 这两个值可以存储到BRDF积分贴图的RG部分。void main() { vec2 integratedBRDF IntegrateBRDF(TexCoords.x, TexCoords.y); FragColor …...

Linux 创建 终止线程(thread)
进程线程区别 创建线程 #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); -功能:创建一个子线程,一般情况下main函数所在的线程称为主线程,…...
【IPC 通信】信号处理接口 Signal API(6)
收发信号思想是 Linux 程序设计特性之一,一个信号可以认为是一种软中断,通过用来向进程通知异步事件。 本文讲述的 信号处理内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解信号编程。 kill(2) 遵循 POSIX.1 - 2008 1.库 …...

ipaguard界面概览
ipaguard界面概览 ipaguard界面分左右2块:左边菜单导航栏,右边的功能区 左侧菜单:按模块分成启动界面,代码模块,文件模块,重签名与测试模块 右侧主功能区会随着功能变化,但是整体分3块…...

萌新的FPGA学习绪论-1
萌新的FPGA学习绪论-1 其实很多的课和内容都是相通的 我在跑完单周期的RiscV时候 虽然最后还差点意思但是基本的逻辑实现没有特别大的问题 过两天写一个Spec文档说明一下 由于开始一个新的设计 所以对于RiscV的设计暂时放到一边希望我能在接下来的时间内尽快完成 暂时不说这个…...

目标检测算法改进系列之Backbone替换为EMO
EMO:结合 Attention 重新思考移动端小模型中的基本模块 近年来,由于存储和计算资源的限制,移动应用的需求不断增加,因此,本文的研究对象是端侧轻量级小模型 (参数量一般在 10M 以下)。在众多小模型的设计中࿰…...
Laravel一些优雅的写法
1. 新增操作 // 原则,所有服务类只有一个public入口,或者多个public入口,但是他们做都是同一件事情 Class CreateService {// 创建类的入口, 根据dto去新建public function create(Dto $dto){// 先构建model对象, 不要在事务期间构建,减少事务…...

vue+three.js中使用Ammo.js
直接通过npm i ammo.js安装进webpack的项目里调用时,会出现如下报错: ERROR in ./node_modules/ammo.js/ammo.js 1:1683-1696 Mo…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...

Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...

PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...