【面试必备】MySQL索引是什么?怎么设计索引?

在后端面试中,MySQL的索引是一个常见问题,尤其是最近掀起了去Oracle的风向。作为一个很宽泛的面试题,不仅考验对MySQL整体知识的了解,也方便面试官随着我们的回答逐渐往下延伸问题。众所周知,面试问题的答案,不仅仅只有结论,很多面试官要的是你对这个问题的分析,看你对这个知识点的掌握程度,而不是只要最后的结论。

文章目录

    • 一、什么是MySQL索引
      • 1、如果有1TB的数据需要排序,但只有32GB的内存如何排序处理?
      • 2、磁盘预读
      • 3、MySQL索引是什么
        • 1、B+树
        • 2、索引
      • 4、索引设计有哪些原则

一、什么是MySQL索引

首先,MySQL是一个数据库,负责存储数据,需要支撑业务系统,这就要求需要在短时间内返回数据 。我们知道 MySQL的真实行记录信息存储在磁盘中 。所以想要从MySQL中获取信息,就意味着去磁盘中获取消息,就需要进行IO操作。如何减少IO次数,减少IO量就变成我们的设计准则。

当数据量很小的时候,这些IO操作带来的影响可以忽略不计,但随着项目的扩展,数据量会逐渐上升,就会导致大量的IO操作,极大的浪费了性能。这时,如果有一个数据量特别的大的文件,超过了内存的容量,那么就不可能会一次性将所有的数据都加载到内存中,这时候需要 分而治之 的思想,进行分块读取数据。块的大小就是设计的一个标准。

前几年常见的一道面试题

1、如果有1TB的数据需要排序,但只有32GB的内存如何排序处理?

传统的排序算法一般指 内排序 算法,针对的是数据可以一次全部载入内存中的情况。但是面对海量数据,即数据不可能一次全部载入内存,需要用到 外排序 的方法。

外排序采用分块的方法(分而治之) ,首先将数据分块,对块内数据按选择一种高效的内排序策略进行排序。然后采用归并排序的思想对于所有的块进行排序,得到所有数据的一个有序序列。

实际做法:

  • 首先把磁盘上的1TB数据分割为40块(chunks),每份25GB。(尽量预留一定空间!)
  • 顺序将每份25GB数据读入内存,使用算法排序(大数据情况下最好选择快排)。
  • 把排序好的数据(也是25GB)存放回磁盘。
  • 循环40次以后,即所有的40个块都已经各自排序了。(剩下的工作就是如何把它们合并排序!)
  • 合并排序就是将所有块一起排序,但是只有25GB可用内存,所以先对40块的每一块进行分割。
  • 从40个块中分别读取25G/40=0.625G入内存(40 input buffers)。
  • 执行40路合并,并将合并结果临时存储于2GB 基于内存的输出缓冲区中。当缓冲区写满2GB时,写入硬盘上最终文件,清空输出缓冲区。
  • 当40个输入缓冲区中任何一个处理完毕时(40个块都是有序的,数据小的块会优先处理完),写入该缓冲区所对应的块中的下一个0.625GB则会进入排序中,直到全部处理完成。

了解完 分而治之 之后,再来了解一个概念:磁盘预读。

2、磁盘预读

磁盘预读是一种优化文件读写性能的技术手段 。在计算机中,当需求读取文件时,系统会先预读取一定量的文件数据到内存中,以提高后续读取的效率。这是基于磁盘的物理特性,通过提前读取数据并加载到缓存中,从而加快文件的读取速度。

原理:在读取磁盘数据时,系统会自动预读取相邻的数据块到内存中。预读取的大小一般为一个或多个簇(cluster),也就是连续的物理块,通常为4KB或8KB等常见大小。我们在进行数据读取的时候,一般选择页的整数倍进行读取。这是因为磁盘读取数据时,需要转动磁盘、定位磁头等操作,这些操作需要一定的时间,而预读取可以在等待时间内同时读取更多的数据,减少后续读取时的等待时间。

例如:MySQL默认引擎Innodb每次读取16KB的数据。

3、MySQL索引是什么

了解了MySQL数据库中行记录信息存储在磁盘中,又知道数据库需要响应业务在短时间返回数据,这就需要一定的方式去获取数据!例如在文件夹中寻找一个信息需要经历以下条件:

文件名称+偏移量(offset)+长度(length)

MySQL数据库也不例外。MySQL是采用B+树作为数据结构

1、B+树

MySQL主要使用B+树作为其索引的数据结构。B+树是B-树的变体,B+树不是直接的k-v存储。
=================================
B+树是一种树数据结构,是一个n叉排序树,每个节点通常有多个孩子。它包含根节点、内部节点和叶子节点。在B+树中,非叶子节点只存储关键字信息,用于索引,并不保存具体的数据值,而所有的数据值都保存在叶子节点中。此外,叶子节点之间通过 指针 相连,以维护数据的 有序性

可以将B+树视为一种特殊的键值存储结构。在B+树中,每个关键字(或键)对应一个值,这些值存储在叶子节点中。通过查找关键字,可以定位到包含相应数据的叶子节点,从而实现数据的检索。这就是MySQL查找数据的方式。

2、索引

索引是帮助数据库高效获取数据的数据结构。它是一张描述索引列的列值与元表中记录行之间一一对应关系的序表。索引除了包含数据本身外,还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,以实现高级查找算法。具体来说,索引是一个指向表中数据的指针,数据库系统可以利用这些指针快速找到所需的数据,而无需扫描整个表。

主要作用如下:

  • 提高查询速度: 通过索引,数据库系统可以不必扫描整个表,而是直接定位到包含所需数据的行,从而显著减少查询时间。这对于大型表来说尤为重要。
  • 加速表与表之间的连接: 在执行连接操作时,如果连接字段已经被索引,那么数据库系统就可以更快地找到匹配的记录,从而提高连接操作的速度。
  • 优化排序和分组操作: 如果经常需要对表中的数据进行排序或分组,那么对排序或分组字段建立索引可以显著提高这些操作的性能。
  • 保证数据的唯一性: 通过创建唯一索引,可以确保表中的每一行数据的某个字段或某几个字段组合的值是唯一的,从而避免重复数据的出现。

虽然索引可以提高查询性能,但它也会占用额外的磁盘空间,并可能增加插入、删除和更新操作的开销。 因此,在创建索引时需要根据实际情况进行权衡,选择最合适的索引策略。同时,也需要定期维护和优化索引,以确保其始终保持良好的性能。

4、索引设计有哪些原则

索引设计在数据库和信息检索系统中起着至关重要的作用,通俗来讲,索引就是数据库表中某个比较有能力的字段, 好的索引直接会影响查询的性能和效率。

以下是一些关键的索引设计原则:

  • 唯一性原则:数据库表结构在设计时判断有没有唯一性字段,如果没有可以提前设计自增主键,通常都是有唯一性字段的。唯一字段作为索引不仅可以加速查询,还可以确保数据的完整性。
  • 选择性原则:优先选择性高的列即不同值的比例高的列。具有高选择性的列可以使得查询结果集更小,从而提高查询效率。
  • 覆盖索引原则:如果一个索引包含了查询需要的所有字段,那么查询就只需要扫描索引,而无需回表获取数据,这被称为覆盖索引。设计索引时,应尽可能使索引覆盖更多的查询场景。
  • 小索引原则:尽量使索引键的长度小,因为小的索引键不仅节省存储空间,还能提高查询效率。例如,对于字符串类型的字段,可以考虑使用前缀索引。
  • 最左前缀原则:对于复合索引,即包含多个字段的索引,查询条件应尽量使用索引的最左字段,这样可以最大限度地利用索引。
  • 更新频率原则:索引虽然可以加速查询,但也会增加数据更新的开销。因此,对于频繁更新的字段,应谨慎考虑是否为其创建索引。
  • 数量限制原则:索引并不是越多越好。过多的索引不仅会占用更多的存储空间,还会降低写操作的性能。
  • 定期维护原则:索引的性能会随着数据的变化而发生变化。因此,应定期对索引进行优化和维护,确保其保持良好的性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【2024年MathorCup数模竞赛】C题赛题与解题思路

2024年MathorCup数模竞赛C题 题目 物流网络分拣中心货量预测及人员排班背景求解问题 解题思路问题一问题二问题三问题四 本次竞赛的C题是对物流网络分拣中心的货量预测及人员排班问题进行规划。整个问题可以分为两个部分,一是对时间序列进行预测,二是对人…

C++list模拟实现

Clist模拟实现 list接口总结结点类的模拟实现迭代器的模拟实现迭代器模板参数迭代器类中的构造函数迭代器类中的运算符重载operator和operator - -operator! 和operatoroperator*operator->总览 list 类构造函数拷贝构造函数赋值运算符重载operatorclear&#xf…

高精度定时器中 single-shot 计数模式不工作

1. 问题提出 客户使用 STM32G474 的高精度定时器,基于 CubeMX 进行外设配置与代码生成,将某个子定时器的计数方式设置为 retriggerable single shot 方式,发现该子定时器无 PWM 输出,在调试模式下发现该子定时器的计数器一直为 0…

2024MathorCup(妈妈杯) C题完整思路+数据集+完整代码+高质量成品论文

C题物流网络分中心货量预测及人员排班 (完整的资料数据集代码在文末) 电商物流网络在订单履约中由多个环节组成,其中,分拣中心作为网络的中 间环节,需要将包裹按照不同流向进行分拣并发往下一个场地,最终使…

「每日跟读」英语常用句型公式 第10篇

「每日跟读」英语常用句型公式 第10篇 1. It goes without saying that __ 毋庸置疑的是 ______ It goes without saying that hard work pays off(毋庸置疑的是,努力工作会有回报) It goes without saying that health is the most important wealth(毋庸置疑的…

C++第十五弹---string基本介绍(一)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、什么是STL 2、STL的版本 3、STL的六大组件 4、STL的重要性 5、如何学习STL 6、STL的缺陷 7、为什么学习string类 7.1、C语言中的字符串…

节省30%成本,宝马使用 NVIDIA Omniverse 构造的数字孪生虚拟汽车工厂,实现降本增效

在数字化转型过程中,汽车制造商宝马集团将工业 AI 的力量运用到整个生产网络,与NVIDIA Omniverse平台共同构建并运行工业元宇宙应用。 宝马集团董事Milan Nedeljković在GTC主题演讲会中,与NVIDIA创始人兼首席执行官黄仁勋共同展示了Omniver…

YOLOv8打印模型结构配置信息并查看网络模型详细参数:参数量、计算量(GFLOPS)

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

LeetCode-1143. 最长公共子序列【字符串 动态规划】

LeetCode-1143. 最长公共子序列【字符串 动态规划】 题目描述:解题思路一:动规五部曲解题思路二:1维DP解题思路三:0 题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。…

TSINGSEE青犀AI智能分析网关V4吸烟/抽烟检测算法介绍及应用

抽烟检测AI算法是一种基于计算机视觉和深度学习技术的先进工具,旨在准确识别并监测个体是否抽烟。该算法通过训练大量图像数据,使模型能够识别出抽烟行为的关键特征,如烟雾、手部动作和口部形态等。 在原理上,抽烟检测AI算法主要…

【目标检测数据集】城市街道垃圾堆相关数据集

一、GarbageOverflow:城市街道垃圾堆数据集 该垃圾堆数据集是通过爬虫从网上进行爬取得到的,一共包含1188张图片,有2个类别,分别为[overflow, No Overflow],两个标签的数量分别为1734个标签和414个标签。部分数据集及…

中国历年GDP统计-探数API统计

数据介绍 时间维度:1978年-2021年 单位:亿元 该数据来源于国家统计局发布的中国统计年鉴2021,为按当年价格计算的中国历年GDP以及人均GDP。 数据说明: 数据来源于国家统计局。

【更新】全国省级-新质生产力数据集(2010-2022年)

01、数据简介 新质生产力,又称为新型生产力,是指在现代科技和经济社会发展的推动下,由新的生产要素、生产方式、生产关系等构成的具有新质特点的生产力。这种生产力突破了传统生产力的局限,具有更高的效率和创造力,是…

题目 2694: 蓝桥杯2022年第十三届决赛真题-最大数字【暴力解法】

最大数字 原题链接 🥰提交结果 思路 对于每一位,我我们都要尽力到达 9 所以我们去遍历每一位, 如果是 9 直接跳过这一位 如果可以上调到 9 我们将这一位上调到 9 ,并且在a 中减去对应的次数 同样的,如果可以下调到 9,我…

黄金基金和黄金有什么区别?

黄金基金本质上是一种投资工具,它通过间接投资黄金或与其紧密相关的金融衍生品来反映黄金市场的表现。不同于直接持有实物黄金,投资者购买黄金基金并不涉及实体黄金的保管问题,而是将资金交由专业的基金管理人管理,由他们代表投资…

Input DropDown 拼接成 select组件(基于antd和react)

前言:为什么不直接用select,还要舍近求远搞inputdropdown这种缝合怪,是因为antd的select不支持选中项再编辑,效果如图 比如:选中的lucy文案变成了placeholder不能再编辑了 封装此组件虽然比较简单,但还是有…

一文读懂Partisia Blockchain,被严重低估的隐私区块链生态

在今年 3 月,隐私公链 Partisia Blockchain 迎来了重要的进展,该生态通证 $MPC 上线了交易所,目前 $MPC 通证可以在 Kucoin、Gate、BitMart、Bitfinex、Bitture 等平台交易,并将在不久后上线 MEXC 平台。 在上个月上线市场至今&am…

中颖51芯片学习4. 可编程计数器阵列PCA0

中颖51芯片学习4. 可编程计数器阵列PCA0 一、PCA介绍1. PCA简介2. SH79F9476的PCA0特性3. PCA0 功能4. 时钟5. PCA0原理框图6. 工作方式 二、PCA0寄存器1. PCA0标志寄存器2. PCA使能寄存器3. PCA0方式寄存器4. P0CPMn PCA捕捉/比较寄存器5. P0FORCE强制输出控制寄存器6. PCA0计…

期货量化交易软件:MQL5 中的范畴论 (第 15 部分)函子与图论

概述 在上一篇文章中,我们目睹了前期文章中涵盖的概念(如线性序)如何视作范畴,以及为什么它们的“态射”在与其它范畴相关时即构成函子。在本文中,我们赫兹量化软件将阐述来自前期文章中的概括,即通过查看…

三方库移植之NAPI开发[2]C/C++与JS的数据类型转

通过NAPI框架进行C/C与JS数据类型的转换 OpenHarmony NAPI将ECMAScript标准中定义的Boolean、Null、Undefined、Number、BigInt、String、Symbol和Object八种数据类型,以及函数对应的Function类型,统一封装成napi_value类型,下文中表述为JS类…