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

news2024/11/24 1:32:21

在后端面试中,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、索引设计有哪些原则

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

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

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

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

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

相关文章

【力扣题】关于单链表和数组习题

🌈 个人主页:白子寰 🔥 分类专栏:python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文…

使用MATLAB的cylinder函数生成圆柱体及其他应用

cylinder 函数是 MATLAB 中的一个内置函数,用于生成表示圆柱体表面的坐标点。这些坐标点可以用于绘制三维图形,如使用 surf 或 mesh 函数进行可视化。 cylinder函数生成单位圆柱体的x、y和z坐标。您可以使用surf或mesh来绘制圆柱形对象,或者…

1233. 全球变暖---BFS

目录 1233. 全球变暖 输入格式 输出格式 数据范围 输入样例1: 输出样例1: 输入样例2: 输出样例2: 思路: 宽搜BFS 模板: 代码: 运行结果: 1233. 全球变暖 你有一张某海域 NN…

Mongo 报错 Can‘t canonicalize query: BadValue $in needs an array

一、遇到的问题 Mongo in查询 [ UserId > array($in>$userIds)] $userIds数组不是连续索引,报错Cant canonicalize query: BadValue $in needs an array 二、解决 array_values($userIds) 重新索引一下变成连续索引即可。 Mongo in查询的数组要是连续索…

WEB3.0:互联网的下一阶段

随着互联网的发展,WEB3.0时代正在逐步到来。本文将深入探讨WEB3.0的定义、特点、技术应用以及未来展望,为读者带来全新的思考。 一、什么是WEB3.0? WEB3.0可以被理解为互联网发展的下一阶段,是当前WEB2.0的升级版。相较于2.0时代…

react状态管理库---zustand

一个简单的,快速的状态管理解决方案,api设计基于函数式和hooks 安装: npm install zustand 基础使用 让我们实现一个非常简单的计数器案例完成我们的第一个store 1- 创建一个counterStore create( ) 有三个参数:函数、布尔值…

[C++][算法基础]模拟散列表(哈希表)

维护一个集合,支持如下几种操作: I x,插入一个整数 x;Q x,询问整数 x 是否在集合中出现过; 现在要进行 N 次操作,对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 N,…

类和对象【一】类和对象简介

文章目录 C的类与C语言结构体的区别【引入类】类的定义类体中的成员函数的实现类中的访问限定符C中class和struct的区别 类的作用域类的实例化类中成员的存储位置类的大小 C的类与C语言结构体的区别【引入类】 类里面不仅可以定义变量还可以定义函数 例 类具有封装性【将在该…

c++ 指针总结

概述 内存地址 在计算机内存中,每个存储单元都有一个唯一的地址(内存编号)。通俗理解,内存就是房间,地址就是门牌号 指针和指针变量 指针(Pointer)是一种特殊的变量类型,它用于存储内存地址。指针的实质…

libcurl 简单实用

LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP、FTP、SMTP、POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发送HTTP请求、下载文件、发送电子邮件等…

【Linux】UDP编程【上】{诸多编程接口/小白入门式讲解}

文章目录 0.预备知识0.1套接字0.2TCP/UDP0.3大小端问题 1.socket 常见API1.1socket1.2各个接口1.3int bind();1.3网络头文件四件套1.4bzero1.5recvfrom1.6sendto() 2.UDP编程2.1服务器编程2.2客户端编程2.3运行测试2.3.1本机通信2.3.2popen2.3.3strcasestr2.3.4回顾C11智能指针…

dfs板子

递归实现排列 留着明早省赛之前看 #include<iostream> using namespace std; int arr[10010]; int brr[10010]; int n,k; void dfs(int num){if(num > n){for(int i 1;i < n;i){cout << arr[i] << " ";}cout << endl;return;}for(in…

mysql题目2

tj11: select sex,count(sex) from t_athletes group by sex; tj12: select name 姓名,TIMESTAMPDIFF(year,birthday,2024-1-1) 年龄 from t_athletes tj13: SELECT * FROM t_athletesWHERE id NOT IN (SELECT aid FROM t_match WHERE sid IN (SELECT id FROM t_sport WHE…

python 的join函数

join函数是一个对字符串处理的函数 字符串.join(str)的含义是把字符串加入到str的每一个间隙里面 如 str1234 ,.join(str) #打印的结果为 1,2,3,4

C语言处理文本模板:格式信函编程

开篇 本篇文章的问题来源为《编程珠玑》第3章其中一个问题&#xff0c;格式信函编程。说白了就是先在文件中定义一个文本模版&#xff0c;然后使用数据库中的数据去填充这个模版&#xff0c;最后得到填充后的文本&#xff0c;并输出。 问题概要 在常去的网店键入你的名字和密码…

动态规划先导片

大家知道动规是由前一个状态推导出来的&#xff0c;而贪心是局部直接选最优的&#xff0c;对于刷题来说就够用了。 对于动态规划问题&#xff0c;我将拆解为如下五步曲&#xff0c;这五步都搞清楚了&#xff0c;才能说把动态规划真的掌握了&#xff01; 确定dp数组&#xff0…

SaaS知识库工具是真的方便,各大企业都在用

你可能听说过“SaaS”&#xff0c;但你是否真的知道它是什么以及它是如何工作的&#xff1f;简单来说&#xff0c;SaaS&#xff08;Software as a Service&#xff09;意味着以服务的形式提供软件&#xff0c;这是一种在线订阅并通过互联网使用软件的方式。放心&#xff0c;听起…

STM32的位操作(相当于51单片机的sbit)

经过一段时间的学习&#xff0c;今天发现STM32的单个端口都有一个32位的地址&#xff0c;这样就可以把这个地址给找出来&#xff0c;进行单个位的操作了&#xff0c;这也没有什么好说的&#xff0c;直接复制粘贴就好了&#xff0c;用到的时候过来复制直接使用就行了。虽然看着挺…

书生·浦语大模型实战营之XTuner 微调个人小助手认知

书生浦语大模型实战营之XTuner 微调个人小助手认知 在本节课中讲一步步带领大家体验如何利用 XTuner 完成个人小助手的微调&#xff01; 为了能够让大家更加快速的上手并看到微调前后对比的效果&#xff0c; 用 QLoRA 的方式来微调一个自己的小助手&#xff01; 可以通过下面两…

react项目规范新手教程

简介 React是一种流行的JavaScript库&#xff0c;用于构建用户界面。搭建一个React项目并不难&#xff0c;但确保项目的结构和配置正确可以帮助你更有效地开发和维护应用程序。以下是搭建React项目的一些步骤&#xff1a; 项目规范&#xff1a;项目中有一些开发规范和代码风格…