面试题:MySQL 索引
1. 谈一下你对于MySQL索引的理解?(为什么MySQL要选择B+树来存储索引)
MySQL的索引选择B+树作为数据结构来进行存储,使用B+树的本质原因在于可以减少IO次数,提高查询的效率,简单来说就是可以保证在树的高度不变的情况下存储更多的数据:
-
IO效率的提高:在MySQL数据库中,表的真实数据和索引数据都是存储在磁盘中,进行数据读写时必然涉及到IO问题。IO是硬件层面的问题,我们在做索引设计时需要尽可能提高IO效率。通常来说,提高IO效率主要有两个方面:减少IO次数和减少IO量。
-
分块读取数据:数据存储量是不可预估的。当表的数据量非常大时,我们无法一次性将所有数据读取到内存中,因此需要分块读取数据。在分块读取时,我们需要设计合理的块大小。
-
数据存储的局部性:数据在磁盘存储时具有时间局部性和空间局部性,内存和磁盘在进行数据交互时并不会逐一读取数据,而是会将相关数据加载到内存中。加载时有一个基本的逻辑单位称为页,页的大小一般是4KB或8KB,具体取决于操作系统。在数据读取时通常会选择页的整数倍读取,例如InnoDB存储引擎每次读取16KB的大小。这与分块读取的设计思想一致,因此块大小通常选择页的整数倍。在MySQL中,默认情况下页的大小是16KB,可以通过参数进行调整,例如InnoDB中的
innodb_page_size参数,但一般情况下不调整这个参数。 -
数据格式设计:确定块大小后,我们需要设计数据格式。使用索引时通常是根据一个或多个索引列的值读取整行数据或部分字段,例如
SELECT * FROM table WHERE id = 10根据id值检索整行记录。因此,数据格式设计为K-V格式,其中K值是索引列的值,V值的设计需要进一步考虑。 -
直接存储行记录:通常情况下,当需要从磁盘读取某行记录时,需要知道一些信息才能定位到数据,如文件名、偏移量和数据长度。这些信息可以用于定位任意行记录。如果将这些信息作为索引信息,在读取数据时首先需要打开一个文件,读取这些信息,然后根据这些信息找到对应的数据文件读取具体行数据。如果每次打开文件即一次IO操作,则至少需要2次IO操作才能读取到数据,不符合减少IO次数的原则。因此,最好的方式是在V中直接存储行记录,这样读取数据时可以直接根据K值读取行记录,将数据和索引绑定存储。在MySQL中,InnoDB存储引擎就是这样存储的,数据文件和索引文件都位于后缀名为
ibd的文件中。 -
选择数据结构:确定数据格式后,我们需要选择合适的数据结构存储数据。支持K-V格式的数据结构有很多,例如哈希表、二叉树、BST、AVL、红黑树等。MySQL最终选择了B+树,下面对比一下各个数据结构的区别:
-
哈希表:哈希表可以存储数据,但本质上是无序散列表,因此在进行范围查询时需要逐一比较数据,效率较低。此外,哈希表存在哈希碰撞或冲突问题,需要设计性能优良的哈希算法,因此不适用。但在MySQL中,MEMORY存储引擎支持哈希索引,InnoDB存储引擎支持自适应哈希。
-
二叉树、BST、AVL、红黑树:这些树可以支持K-V格式的数据存储,但它们最多只有两个分支。在进行数据存储时,一个三层的树最多可以存储7个数据,数据量较少。若想存储更多数据,只能增加树的高度,但树的高度增加会导致IO次数增加,影响查询效率。因此需要考虑在保证树高度不变的情况下存储更多数据。因此,B-树应运而生。
-
B-树:B-树在每个数据块中包含三种类型的数据:key值、行记录和指针。读取数据时只需逐层向下检索即可。假设一个数据块大小为16KB,读取48KB数据即可获取所查询的记录。一个三层的B-树最多可以存储4095条记录,数据量依然较少,若想存储更多数据只能增加树的高度,影响查询效率。因此需要优化数据结构。

-
B+树:B+树将所有数据都存储在叶子节点,非叶子节点只存储key值和指针。检索数据时可以从根节点向下检索,也可以在叶子节点中进行前后检索。假设一个数据块大小为16KB,key和指针总大小为10字节,一个三层B+树最多可以存储42928704条记录,相较于B-树存储的数据量更大。

因此,MySQL最终选择B+树作为数据结构进行存储。通常情况下,3-4层的B+树足以支持千万级别的数据量存储。
-
2. 索引有哪些分类?
索引的分类可从不同角度进行区分:
- 从数据结构角度:B+树索引、哈希索引、全文索引(FULLTEXT)、R-Tree索引(用于对GIS数据创建SPATIAL索引)。
- 从物理存储角度:聚簇索引和非聚簇索引。
- 从逻辑角度:主键索引、普通索引、唯一索引、组合索引。
3. 聚簇索引与非聚簇索引

在MySQL的InnoDB存储引擎中,数据插入时必须与某个索引列绑定存储。如果存在主键,则选择主键;若无主键,则选择唯一键;若无唯一键,系统会生成一个6字节的rowid进行存储。
- 聚簇索引:与数据绑定存储的索引称为聚簇索引。
相关文章:
面试题:MySQL 索引
1. 谈一下你对于MySQL索引的理解?(为什么MySQL要选择B+树来存储索引) MySQL的索引选择B+树作为数据结构来进行存储,使用B+树的本质原因在于可以减少IO次数,提高查询的效率,简单来说就是可以保证在树的高度不变的情况下存储更多的数据: IO效率的提高:在MySQL数据库中,…...
云计算day13
一、Git 概述 Git 是一种分布式版本控制系统,用于跟踪和管理代码的变更。它是由 Linus Torvalds 创建的,最初被设计用于 Linux 内核的开发。Git 允许开发 人员跟踪和管理代码的版本,并且可以在不同的开发人员之间进行协作。 Github 用的就…...
2024年孝感中级职称报名开始了吗?
2024年孝感中级职称申报终于开始了,之前参加过水测的小伙伴们,开始准备评审了 2024年孝感本批次申报时间:中级、初级职称网上申报时间:2024年8月1日至8月31日。 注意:个人通过“湖北省职称评审管理信息系统”申报,须先…...
RAG技术之Router
Router有什么用? 在RAG应用中,Router可以帮助我们基于用户的查询意图来决定使用何种数据类型或数据源,比如是否需要进行语义检索、是否需要进行text2sql查询,是否需要用function call来进行API调用。 Router也可以根据用户的查询…...
linux系统通过修改sudo文件使普通用户拥有类似root用户权限
说明:普通用户要想拥有root权限,如果不在sudo文件里配置就算把该用户加到wheel组(root用户所在的组)也不行。 要想通过在命令前加上sudo使得该用户以root权限执行命令,需要修改/etc/sudoers文件。 (如果通…...
基于PyCharm在Windows系统上远程连接Linux服务器中Docker容器进行Python项目开发与部署
文章目录 摘要项目结构项目开发项目上线参考文章 摘要 本文介绍了如何在Windows 10系统上使用PyCharm专业版2024.1,通过Docker容器在阿里云CentOS 7.9服务器上进行Python项目的开发和生产部署。文章详细阐述了项目结构的搭建、PyCharm的使用技巧、以及如何将开发项…...
TypeScript学习篇-类型介绍使用、ts相关面试题
文章目录 基础知识基础类型: number, string, boolean, object, array, undefined, void(代表该函数没有返回值)enum(枚举): 定义一个可枚举的对象typeinterface联合类型: |交叉类型: &any 类型null 和 undefinednullundefined never类型 面试题及实战1. 你觉得使用ts的好处…...
超详细!Jmeter性能测试
前言 性能测试是一个全栈工程师/架构师必会的技能之一,只有学会性能测试,才能根据得到的测试报告进行分析,找到系统性能的瓶颈所在,而这也是优化架构设计中重要的依据。 测试流程: 需求分析→环境搭建→测试计划→脚…...
C语言经典习题24
文件操作习题 一 编程删除从C盘home文件夹下data.txt文本文件中所读取字符串中指定的字符,该指定字符由键盘输入,并将修改后的字符串以追加方式写入到文本文件C:\home\data.txt中。 #include<stdio.h> main() { char s[100],ch; int i;…...
SQL labs-SQL注入(三,sqlmap使用)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 引言: 盲注简述:是在没有回显得情况下采用的注入方式,分为布尔盲注和时间盲注。 布尔盲注:布尔仅有两种形式,ture&#…...
统一认证与单点登录:简明概述与应用
1. 统一认证概述 统一认证是一种身份验证机制,允许用户使用一个账户来访问多个系统和应用程序。它的主要目标是简化用户的登录过程,提高安全性,并减少管理开销。统一认证通过集中管理用户信息,使得用户只需一次认证即可访问不同的…...
MSPM0G3507学习笔记1:开发环境_引脚认识与点灯
今日速通一款Ti的单片机用于电赛:MSPM0G3507 这里默认已经安装好了Keil5_MDK 首先声明一下: 因为是速成,所以需要一定单片机学习基础,然后我写的也不会详细,这个专栏的笔记也就是自己能看懂就行的目标~~~ 文章提供测试代码解…...
使用法国云手机进行面向法国的社媒营销
在当今数字化和全球化的时代,社交媒体已经成为企业营销和拓展市场的重要工具。对于想进入法国市场的企业来说,如何在海外社媒营销中脱颖而出、抓住更多的市场份额,成为了一个关键问题。法国云手机正为企业提供全新的营销工具,助力…...
C++学习笔记——模板
学习视频 文章目录 模板的概念函数模板函数模板语法函数模板注意事项函数模板案例普通函数与函数模板的区别普通函数与函数模板的调用规则模板的局限性 类模板类模板与函数模板区别类模板中成员函数创建时机类模板对象做函数参数类模板与继承类模板成员函数类外实现类模板分文件…...
财务分析,奥威BI行计算助力财务解放报表工作
【财务分析,奥威BI行计算助力财务解放报表工作】 在企业的财务管理体系中,财务报表的编制与分析是至关重要的一环。然而,传统的手工编制报表方式不仅耗时耗力,还难以应对日益复杂多变的财务数据需求。奥威BI(Business…...
文件写入、读出-linux
基于linux操作系统,编写存储功能,在网上搜了几个例子,一直报创建错误, fopen(SAVE_PATH_OWN_INF_FILE, "w") fopen(SAVE_PATH_OWN_INF_FILE, "a"), 使用这两个创建均失败,最后发现创建可以用以…...
环境搭建-Windows系统搭建Docker
Windows系统搭建Docker 一、系统虚拟化1.1 启用虚拟化2.2 启用Hyper-v并开启虚拟任务 三、安装WSL3.1 检验安装3.2 安装WSL 四、Docker安装4.1 Docker安装包下载4.2 Docker安装4.3 运行docker Desktop 五、Docker配置5.1 打开Docker配置中心5.2 配置Docker国内镜像 六、使用 一…...
k8s零零散散问题
安装教程 https://blog.csdn.net/weixin_43933728/article/details/137977799 加入集群错误问题 https://blog.csdn.net/Linbling/article/details/139122862...
The Llama 3 Herd of Models.Llama 3 模型论文全文
现代人工智能(AI)系统是由基础模型驱动的。本文提出了一套新的基础模型,称为Llama 3。它是一组语言模型,支持多语言、编码、推理和工具使用。我们最大的模型是一个密集的Transformer,具有405B个参数和多达128K个tokens的上下文窗口。本文对Llama 3进行了广泛的实证评价。我们…...
ChatGPT的原理和成本
ChatGPT就是人机交互的一个底层系统,某种程度上可以类比于操作系统。在这个操作系统上,人与AI之间的交互用的是人的语言,不再是冷冰冰的机器语言,或者高级机器语言,当然,在未来的十来年内,机器语…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...
