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次,最多树的高度次),所以具体可以容纳多少条数据而不影响性能需要根据具体的数据来分析。

如果面试聊到这里,怕是接着就要聊分库分表了

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

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

相关文章

六、如何让卡片一直对着摄像头

上期我们创建了卡片&#xff0c;那么如何让卡片一直面向浏览器。这个交互有一部分公司还是很需要的&#xff0c;今天我们就来讲讲&#xff0c;先看效果图 在animate.js里面增加卡片Mesh的LookAt&#xff0c;代码如下 import camera from "./camera"; import rendere…

【STM32】IAP升级01 bootloader实现以及APP配置(主要)

APP程序以及中断向量表的偏移设置 前言 通过之前的了解 之前的了解&#xff0c;我们知道实现IAP升级需要两个条件&#xff1a; 1.APP程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始&#xff1b; 2.APP程序的中断向量表相应的移动&#xff0c;移动的偏移量为 x&#xff…

如何制作gif动图gif (多图合成gif、GIF录制软件、视频制作成GIF动图)

文章目录 1 在线制作多图合成gif动画2 GIF录制软件3 将现有的视频 制作成GIF动图 1 在线制作多图合成gif动画 在线制作gif动画链接:https://www.matools.com/gif ①选择需要制作gif动画的图片将其添加 ②调整时间间隔&#xff0c;图片宽高等设置 ③一键生成gif ④下载到本…

两种风格的纯CSS3加载动画

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>加载动画</title><style>.loader {w…

蓝桥杯每日一题2023.9.27

4408. 李白打酒加强版 - AcWing题库 题目描述 题目分析 对于这题我们发现有三个变量&#xff0c;店&#xff0c;花&#xff0c;酒的数量&#xff0c;对于这种范围我们使用DP来进行分析。 dp[i][j][k]我们表示有i个店&#xff0c;j朵花&#xff0c;k单位酒的集合&#xff0c…

数据挖掘note(赵老师语录)

&#xff08;一&#xff09; 数据挖掘一般分为机器学习和统计学习&#xff0c;大数据学的课程一般是关于机器学习&#xff0c;我们学的浅&#xff0c;主要关于统计学习&#xff0c;示意图如下所示&#xff1a; 这是一个大数据时代&#xff0c;但是数据挖掘的利用率不足0.5%&am…

MySQL 索引的作用、索引结构及执行流程介绍(索引篇 一)

索引介绍 MySQL索引&#xff08;index&#xff09;是一种用于加快数据库中数据搜索和查询的数据结构。它类似于书籍的目录&#xff0c;可以帮助数据库快速定位和访问特定数据&#xff0c;而无需扫描整个数据表。 索引的作用和缺点 1. 加快数据搜索&#xff1a;通过使用索引&…

linux下离线安装telnet

安装过程概要&#xff1a; &#xff08;一&#xff09;互联网端下载rpm包&#xff1b; &#xff08;二&#xff09;上传到服务器root目录下&#xff1b; &#xff08;三&#xff09;安装telnet服务和测试&#xff1a; 详细内容&#xff1a; &#xff08;一&#xff09;互联…

Redis与分布式-主从复制

接上文 常用中间件-OAuth2 1.主从复制 启动两个redis服务器。 修改第一个服务器地址 修改第二个redis 然后分别启动 redis-server.exe redis.windows.conf) 查看当前服务器的主从状态&#xff0c;打开客户端&#xff1a;输入info replication命令来查看当前的主从状态&am…

601-体育馆的人流量

文章目录 601-体育馆的人流量1. 题目2. 思路3. 解决4. 运行结果 601-体育馆的人流量 1. 题目 2. 思路 思路&#xff1a;查询Stadium表中人流量超过100的记录&#xff0c;将查询结果与自身的临时表连接&#xff0c;再使用where获得满足条件的记录 查询Stadium表中人流量超过10…

【数据分享】2023年我国行政村(社区)点位数据(免费获取\shp格式\excel格式)

行政村&#xff08;社区&#xff09;点位数据是我们各项研究中经常使用到的数据&#xff0c;在之前的文章中我们分享过2022年度的行政村&#xff08;社区&#xff09;点位数据&#xff08;可查看之前的文章获悉详情&#xff09;。本次我们带来的是2023年的全国范围的行政村&…

iOS自动化测试方案(一):MacOS虚拟机保姆级安装Xcode教程

文章目录 一、环境准备二、基础软件三、扩展&#xff1a;usb拓展插件 一、环境准备 1、下载VMware虚拟机的壳子&#xff0c;安装并注册软件(可以百度注册码)&#xff0c;最新版本&#xff1a;v17 2、下MacOS系统iOS镜像文件&#xff0c;用于vmware虚拟机安装&#xff0c;当前镜…

Linux(CentOS/Ubuntu)——安装nginx

如果确定你的系统是基于CentOS或RHEL&#xff0c;可以使用以下命令&#xff1a; ①、安装库文件 #安装gcc yum install gcc-c#安装PCRE pcre-devel yum install -y pcre pcre-devel#安装zlib yum install -y zlib zlib-devel#安装Open SSL yum install -y openssl openssl-de…

【力扣每日一题】2023.9.27 餐厅过滤器

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目挺长&#xff0c;估计中等难度是给在了阅读理解上。 简单来说就是给我们一堆餐厅的信息&#xff0c;每个餐厅拥有五个属性&#xff…

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Badge

可以附加在单个组件上用于信息标记的容器组件。该组件从API Version 7开始支持。 支持单个子组件。子组件类型&#xff1a;系统组件和自定义组件&#xff0c;支持渲染控制类型&#xff08;if/else、ForEach和LazyForEach&#xff09;。 一、接口 方法1&#xff1a; Badge(value…

宁德时代Inside,中国智驾Outside!

随着华为Mate 60系列的未发先售&#xff0c;问界新M7的朋友圈疯狂刷屏到今日刘德华惊喜现身的“华与华”发布会&#xff0c;余承东的一句“遥遥领先”彻底出圈。 华为的“遥遥领先”&#xff0c;早已不止步于智能手机领域。在刚刚结束的华为秋季全场景新品发布会上&#xff0c…

那么国内比较好用的ai写作助手?

在过去的几年里&#xff0c;人工智能&#xff08;AI&#xff09;已经取得了巨大的进步&#xff0c;其中之一就是AI写作助手。这些工具基于先进的自然语言处理技术&#xff0c;可以生成多种类型的文本&#xff0c;包括文章、博客、广告文案、新闻稿等。它们不仅可以提供高质量的…

laravel设置与获取header请求头

laravel设置与获取header请求头 设置 <?phpnamespace App\Http\Controllers\Text;use Illuminate\Http\Request; use App\Http\Controllers\Controller;class TextController extends Controller {public function TextCC(Request $request){$token $request->header(j…

JAXB(Java Architecture for XML Binding)下载、使用

简介 JAXB&#xff08;Java Architecture for XML Binding&#xff09;就是XML数据绑定的java架构。JAXB可以根据XML Schema生成java类&#xff0c;也能根据java类生成XML Schema&#xff0c;能将XML数据unmarshall到Java内容树&#xff0c;也能将Java内容树持久化为XML数据。…

优化Python开发环境的几个神技巧

用Python编代码体验极佳&#xff0c;并且随着新版本的发布越来越好&#xff01; 对于很多人而言&#xff0c;Python提供的大量免费函数库、高可读性的程序和新引入的类型注释让很多爱不释手。 然而&#xff0c;数据科学家特别容易使自己的Jupyter notebook变得庞大而杂乱&…