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.mzph.cn/news/89827.shtml

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

相关文章

iMovie for Mac v10.3.9(视频剪辑)

iMovie是一款视频剪辑软件&#xff0c;广泛应用于Mac和iOS设备。以下是关于iMovie软件的一些推荐信息&#xff1a; 简单易用。iMovie的设计简洁&#xff0c;操作简单&#xff0c;即使是没有剪辑经验的新手也可以轻松上手。软件内置了丰富的视觉效果、滤镜、绿幕抠图、分屏和画…

MacBook Pro 电池电量限制充电怎么设置AlDente Pro for Mac最大充电限制工具

通过充电电量限制工具可以更好的保护MacBook Pro的电池&#xff0c;通过 AlDente Pro 您可以设置电池的最大充电百分比设置为 20&#xff05; 至 100&#xff05;&#xff0c;然后&#xff0c;它将保持在所需的电池百分比&#xff0c;然后再次使用电源适配器进行充电。 AlDent…

基于SSM的实习管理系统

基于SSM的实习管理系统、前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 管理员界面 教师 学生 研究背景 基于SSM的实习管理系统是一个基于Spring、Spring…

百度SEO优化基本原理(掌握SEO基础,提高网站排名)

随着互联网的迅速发展&#xff0c;越来越多的企业开始意识到网站优化的重要性&#xff0c;其中百度SEO优化是企业不可忽视的一项工作。本文将介绍百度SEO优化的基本概念、步骤、原理、解决方法和提升网站标题优化的方法。蘑菇号-www.mooogu.cn 百度SEO优化是指针对百度搜索引擎…

数字IC设计笔试常见大题整理(简答+手撕)

IC修真院为大家整理了一些数字IC设计的笔试常见题目&#xff0c;大家快来领取吧~ 面试题目&#xff08;文末可全领&#xff09; 1. 简述latch与FF的区别&#xff0c;并用verilog分别实现1bit latch与DFF。 Latch对电平信号敏感&#xff0c;在输入脉冲的电平作用下改变状态。…

电脑显示系统错误怎么办?

有时我们在开机时会发现电脑无法开机&#xff0c;并显示系统错误&#xff0c;那么这该怎么办呢&#xff1f;下面我们就一起来了解一下。 方法1. 替换SAM文件解决问题 1. 重启电脑并进入安全模式。 Win8/10系统&#xff1a;在启动电脑看到Windows标志时&#xff0c;长按电源键…

C++中实现雪花算法来在秒级以及毫秒及时间内生成唯一id

1、雪花算法原理 雪花算法&#xff08;Snowflake Algorithm&#xff09;是一种用于生成唯一ID的算法&#xff0c;通常用于分布式系统中&#xff0c;以确保生成的ID在整个分布式系统中具有唯一性。它的名称来源于雪花的形状&#xff0c;因为生成的ID通常是64位的整数&#xff0…

Servlet开发-通过代码案例熟悉HttpServletRequest类

关于Servlet开发的流程推荐看servlet开发-通过Tomcat部署一个简单的webapp Servlet开发与idea集成的插件安装推荐看idea集成tomcat&#xff08;Smart Tomcate插件安装&#xff09; postman&#xff08;第三方创建HTTP请求工具&#xff09;的安装推荐看创建HTTP请求的几种方式…

vue 脚手架 入门 记录

vue 脚手架 入门 记录 以管理员身份运行PowerShell执行&#xff1a;get-ExecutionPolicy&#xff0c;回复Restricted&#xff0c;表示状态是禁止的 3.执行&#xff1a;set-ExecutionPolicy RemoteSigned 4.选择Y 注意&#xff1a;一定要以管理员的身份运行PowerShell&#xff…

【JVM】并发可达性分析-三色标记算法

欢迎访问&#x1f44b;zjyun.cc 可达性分析 为了验证堆中的对象是否为可回收对象&#xff08;Garbage&#xff09;标记上的对象&#xff0c;即是存活的对象&#xff0c;不会被垃圾回收器回收&#xff0c;没有标记的对象会被垃圾回收器回收&#xff0c;在标记的过程中需要stop…

JeecgBoot v3.5.5 版本发布,性能大升级版本—开源免费的低代码开发平台

项目介绍 JeecgBoot是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…

【Java 进阶篇】深入理解 SQL 分组查询

SQL 是结构化查询语言&#xff08;Structured Query Language&#xff09;的缩写&#xff0c;是用于管理关系型数据库的标准语言。在 SQL 中&#xff0c;查询是其中最重要的部分之一&#xff0c;通过查询&#xff0c;我们可以从数据库中检索所需的数据。分组查询是 SQL 查询中的…

生命在于研究——CVE-2021-22214记录

一、前言 我现在在某央企驻场&#xff0c;渗透测试工程师&#xff0c;也负责漏洞管理平台&#xff0c;也就是监测、渗透测试出现的漏洞&#xff0c;都会录入平台&#xff0c;走流程整改复测办结。 二、漏洞详情 1、漏洞简介 GitLab存在前台未授权SSRF漏洞&#xff0c;未授权…

认识电磁干扰?|深圳比创达EMC

认识电磁干扰&#xff1f;相信不少人是有疑问的&#xff0c;今天深圳市比创达电子科技有限公司就跟大家解答一下&#xff01; 1、电磁干扰(Electromagnetic Interference)&#xff1a;简称EMI&#xff0c;有传导干扰和辐射干扰两种&#xff1b; 2、传导干扰&#xff1a;主要是…

win10录屏的3种方法,让你的视频更加精彩

在现代工作和娱乐中&#xff0c;录制屏幕活动已经变得非常重要。无论您是教育工作者、内容创作者还是想分享您的技能或游戏成就&#xff0c;win10 提供了多种方法来满足这个需求。本文将介绍3种win 10录屏的方法。无论您是初学者还是有经验的用户&#xff0c;我们都会为您提供详…

联盟 | 彩漩 X HelpLook,AI技术赋能企业效率提升

近日&#xff0c;AI 驱动的 PPT 协作分享平台「 彩漩 」与 AI 知识库搭建工具「 HelpLook」&#xff0c;携手为用户工作流注入更多智能和创造力&#xff0c;全面拥抱 AIGC 时代带来的机遇&#xff0c;致力于提供前沿的智能解决方案。 彩 漩 彩漩是一个以 AI 技术为基础、贯彻 …

自制网页。

文章目录 注:代码中图片等素材均来自网络,侵删 20230920_213831 index.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-…

Java当中的BIO模型

我们知道Java中的IO模型分为BIO和NIO模型&#xff0c;BIO是BlCKING IO的简称而NIO当中的N有两层意思&#xff0c;一个是从java1.4开始出现的NEW IO&#xff0c;今天我们来聊一聊为什么传统的BIO会慢以及它并不适合大量的连接&#xff0c;我们先来看一段简单的代码&#xff0c;这…

pt28django教程

缓存 缓存是一类可以更快的读取数据的介质统称&#xff0c;读取硬盘、较复杂的计算、渲染都会产生较大的耗时。数据变化频率不会很高的场景适合使用缓存。使用缓存场景&#xff1a;博客列表页、电商商品详情页、缓存导航及页脚。 Django中设置缓存 Django中提供多种缓存方式…

Mac电脑视频处理工具 Topaz Video AI for mac

Topaz Video AI是一款强大而易用的视频处理软件&#xff0c;通过人工智能技术提供高质量的视频增强和编辑功能。它可以帮助用户改善视频的质量、修复缺陷、优化图像&#xff0c;并提供丰富的编辑选项&#xff0c;以满足个性化的视频处理需求。无论是专业摄影师、视频编辑人员&a…