鱼皮面试鸭30天后端面试营

day1

1. MySQL的索引类型有哪些?

MySQL里的索引就像是书的目录,能帮数据库快速找到你要的数据。以下是各种索引类型的通俗解释:

按数据结构分

  • B+树索引:最常用的一种,数据像在一棵树上分层存放,能快速定位范围数据,比如查找某个分数区间内的学生成绩。
  • 哈希索引:通过把数据变成哈希值来建立索引,查找速度特别快,但只适合精确查找,比如根据身份证号找特定的人,要是找某个范围的就不行了。
  • 倒排索引(全文索引):主要用来处理文本数据,比如在一篇文章里找特定的词,它会记录每个词在哪些文档里出现过。
  • R - 树索引:用于处理多维空间数据,比如地图上查找某个区域内的所有店铺。

基于InnoDB B+树索引分

  • 聚簇索引:数据和索引是放在一起的,就像书的正文和目录装订在一起,一般主键会默认是聚簇索引,找数据时速度快。
  • 非聚簇索引:数据和索引分开存放,就像书的正文和目录分开,查找到索引后还得再去查数据。

按索引性质分

  • 普通索引:最基本的索引,用来加快查询速度,比如在学生表中给姓名字段建普通索引,查特定姓名的学生更快。
  • 主键索引:特殊的唯一索引,每个表只能有一个,就像每个人的身份证号,不能重复且必须有,用来唯一标识一行数据。
  • 联合索引:把多个字段组合起来建索引,比如在学生表中把班级和成绩两个字段建联合索引,查某个班级特定成绩范围的学生时会更高效。
  • 唯一索引:保证索引列的值不能重复,但可以有NULL值,比如员工表中员工编号字段建唯一索引。
  • 全文索引:上面按数据结构分的时候讲过,用于在文本中快速查找特定词汇。
  • 空间索引:和R - 树索引类似,用于处理地理空间等数据,比如查找某个城市内的所有加油站。

2.MySQLInnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?

聚簇索引

  • “索引叶子结点存储的是数据行,可以直接访问完整数据”:就好比一本书,它的目录后面直接跟着对应的正文内容。在聚簇索引里,索引的最底层(叶子结点)存的不只是索引信息,而是整行的数据。所以当你通过聚簇索引去查找数据时,一下子就能拿到完整的一行数据,不用再去别的地方找。
  • “每个表只能有一个聚簇索引,通常是主键索引,适合范围查询和排序”:每个表就像一本独特的书,只能有一份这种目录和正文紧密相连的结构,也就是只能有一个聚簇索引。一般情况下,主键就充当了这个聚簇索引,因为主键能唯一确定一行数据。如果要查找某个范围的数据,比如找成绩在80 - 90分之间的学生记录,或者要对数据进行排序,聚簇索引处理起来就比较高效,因为数据在物理存储上是按照一定顺序排列的。

非聚簇索引

  • “索引叶子节点存储的是数据行的主键和对应的索引列,需通过主键才能访问完整的数据行”:非聚簇索引像是另外单独的一个小目录,这个小目录里记录的是数据行的主键信息以及对应的索引列信息。当你通过这个小目录找到对应的主键后,还得再去聚簇索引那里,根据主键把完整的数据行找出来,就好像你先在小目录里查到页码,还得去书的正文里找具体内容。
  • “一个表可以有多个非聚簇索引(称之为非主键索引、辅助索引、二级索引),适用于快速查找特定列的数据”:一个表可以有很多个这样的小目录,也就是可以有多个非聚簇索引。当你只需要查找表中的某一个或几个特定列的数据时,用非聚簇索引就比较快。比如你只想查学生表中的学生姓名,在姓名字段上建了非聚簇索引的话,就能快速定位到这些姓名信息。

3. MySQL 的存储引擎有哪些?它们之间有什么区别?

InnoDB

  • 支持事务、行级锁和外键:事务就像一个打包任务,要么全成功,要么全失败,比如转账时同时增减双方账户金额。行级锁是只锁定要处理的那一行数据,这样别人还能操作其他行,就像你在图书馆占一个座位,不妨碍别人坐其他座位。外键能把不同表的数据关联起来,比如学生表和成绩表通过学号关联。
  • 提供高并发性能,适用于高负载的OLTP应用:可以同时处理很多人的操作请求,像银行系统很多人同时转账、查询等。
  • 数据以聚集索引的方式存储,提高检索效率:数据存放方式让查找速度变快,就像书的目录和正文放一起,找内容方便。

MyISAM

  • 不支持事务和外键,使用表级锁:没有事务打包功能,也不能关联不同表数据。表级锁是锁定整张表,就像你把整个图书馆占了,别人都不能用。
  • 适合读取多、更新少的场景,如数据仓库:如果只是经常查数据,很少改数据,用它就挺好,像公司用来分析历史数据的数据仓库。
  • 具有较高的读性能和较快的表级锁定:读数据速度快,锁定表也快。

MEMORY

  • 数据存储在内存中,速度快,但数据在服务器重启后丢失:数据放在内存里,访问就像在眼前拿东西一样快。不过服务器一重启,内存里的数据就没了,就像电脑重启后没保存的临时文件没了。
  • 适用于临时数据存储或快速缓存:比如存临时计算结果,或者做快速缓存来加快访问。

NDB (NDCluster)

  • 支持高可用性和数据分布,适合大规模分布式应用:能保证服务一直可用,数据还能分散存,适合像大型电商平台那种大规模分布式系统。
  • 提供行级锁和自动分区:行级锁不影响别人操作其他行,自动分区把数据分到不同地方存,提高性能。

ARCHIVE

  • 用于存储大量历史数据,支持高效的插入和压缩:适合存公司多年的历史订单等大量历史数据,存数据快还能压缩节省空间。
  • 不支持索引,适合日志数据存储:不能用索引快速查找,但存日志数据很合适,反正日志主要是按顺序记录。

day2

1.MySQL 索引的最左前缀匹配原则是什么?

把 MySQL 索引想象成一本字典。字典前面有个目录,我们可以快速找到想要的字,MySQL 索引就和这目录类似,能帮数据库快速找到数据。最左前缀匹配原则,就像是查字典时按照顺序查一样。

联合索引就像多层目录

在 MySQL 里,如果我们给多个字段创建了联合索引,这就好比字典有个多层的目录。比如说,我们给一个表的姓、名这两个字段建了联合索引,这个联合索引就像是字典先按姓排了个顺序,在每个姓下面又按名排了顺序。

必须从最左边开始查找

最左前缀匹配原则要求我们查询的时候得从联合索引的最左边字段开始用。还拿姓和名的联合索引来说,如果我们只根据“名”去查,这个联合索引就帮不上忙了,因为索引是先按姓排的。只有先根据“姓”查,然后可能再根据“名”进一步缩小范围,索引才能发挥作用。

连续使用索引字段

再举个例子,如果联合索引是 (字段A, 字段B, 字段C) 。当我们查询条件是 “字段A = 某个值” 时,索引能用;当查询条件是 “字段A = 某个值 AND 字段B = 某个值” 时,索引也能用;当查询条件是 “字段A = 某个值 AND 字段B = 某个值 AND 字段C = 某个值” 时,索引还是能用。但要是查询条件是 “字段B = 某个值 AND 字段C = 某个值” ,没有最左边的字段A,索引就用不上了。而且查询时字段得连续用,要是查询条件是 “字段A = 某个值 AND 字段C = 某个值” ,跳过了字段B,那么索引也只能用到字段A,字段C那部分索引就不能用。

简单来说,最左前缀匹配原则就是在使用联合索引查询时,要从最左边的字段开始,按照顺序连续使用索引里的字段,这样索引才能高效地帮我们找到数据。

2.为什么 MySQL选择使用 B+树作为索引结构?

可以把 MySQL 里的数据想象成图书馆里的大量书籍,而索引就像是图书馆的目录,能让我们快速找到想要的书。MySQL 选择 B+树作为索引结构,主要有下面几个原因:

1. 查找效率高

B+树有个特点,它的所有数据都存放在叶子节点,而且叶子节点之间有指针相连,形成了一个有序链表。这就好比图书馆的目录,把同一类书按照编号排得整整齐齐。当我们要查找某条数据时,就像在目录里找对应的书编号,通过一层一层地比较节点上的值,能快速缩小查找范围,找到我们想要的数据。而且不管数据量有多大,查找的时间都比较稳定,不会因为数据变多就慢很多。

2. 适合范围查询

在实际应用中,我们经常需要查询某个范围内的数据,比如查询年龄在 20 到 30 岁之间的用户。B+树的叶子节点是有序的链表,这就方便极了。我们只要找到范围的起始点,然后顺着链表往后找,就能把这个范围内的数据都找出来。就像在图书馆目录里找到某一类书的起始编号,然后顺着编号顺序就能找到这一类里所有的书。

3. 磁盘读写性能好

数据库的数据通常存放在磁盘上,磁盘读写是比较耗时的操作。B+树的节点可以存储多个键值对,每个节点对应磁盘上的一个页。这样一来,一次磁盘读取能获取更多的数据,减少了磁盘 I/O 的次数。就好比我们去图书馆借书,一次能多拿几本,就不用来回跑那么多次了,效率自然就提高了。

4. 插入和删除操作稳定

在数据库里,数据是经常要进行插入和删除操作的。B+树在进行这些操作时,能通过节点的分裂和合并来保持树的平衡,不会因为频繁的插入和删除导致树的结构变得很混乱,影响查找效率。这就像图书馆的管理员,在不断地添加和拿走书籍后,还能把书架整理得井井有条,让我们还是能快速找到想要的书。

总的来说,B+树的这些优点让它很适合作为 MySQL 的索引结构,能让数据库在查找、插入、删除等操作上都有比较好的性能表现。

3.MySQL 三层 B+树能存多少数据?

要估算 MySQL 三层 B+ 树能存多少数据,我们需要先了解 B+ 树的结构特点,再分析每个节点大概能存储多少数据,最后得出三层 B+ 树的总存储量。

B+ 树结构基础

B+ 树是一种多路平衡查找树,在 MySQL 里,B+ 树的非叶子节点(索引节点)只存储索引信息,而数据都存放在叶子节点中。叶子节点之间通过指针相连,形成有序链表。我们可以把 B+ 树想象成一个多层的目录结构,非叶子节点是上层目录,叶子节点是最终存放具体内容的页面。

计算各层节点可存储的数据量

1. 假设前提
  • 一个数据页的大小通常为 16KB(这是 MySQL InnoDB 存储引擎默认的数据页大小)。
  • 非叶子节点(索引节点)主要存储索引键值和指向子节点的指针。假设一个索引键值和指针的组合大小为 8 字节(这只是为了方便计算做的假设,实际大小会因数据类型等因素而不同)。
  • 叶子节点存储实际的数据记录,假设一条数据记录大小为 1KB(同样是假设值,实际大小取决于表结构)。
2. 计算非叶子节点可存储的子节点指针数量

由于一个数据页大小是 16KB(即 16 * 1024 = 16384 字节),一个索引键值和指针组合大小为 8 字节,那么一个非叶子节点能存储的子节点指针数量为:16384 ÷ 8 = 2048 个。

3. 分析三层 B+ 树的存储情况
  • 第一层(根节点):根节点是一个非叶子节点,它能存储 2048 个指向第二层节点的指针。
  • 第二层(中间层非叶子节点):每个第二层的非叶子节点同样能存储 2048 个指向第三层节点的指针。因为根节点有 2048 个指针指向第二层节点,所以第二层总共有 2048 个非叶子节点,那么第二层所有节点能指向的第三层节点数量为 2048 × 2048 个。
  • 第三层(叶子节点):每个叶子节点存储实际的数据记录,假设一条记录大小为 1KB,一个叶子节点(数据页)能存储 16 条记录(16KB ÷ 1KB = 16)。由于第二层节点指向第三层的叶子节点数量为 2048 × 2048 个,所以三层 B+ 树能存储的数据记录总数为 2048 × 2048 × 16 = 67108864 条。

需要注意的是,以上计算是基于假设的数据页大小、索引键值和指针大小以及数据记录大小得出的,实际情况中这些值会因表结构、数据类型等因素而有所不同,但通过这种方式能让你大致了解三层 B+ 树的存储量级。

day3

day4

day5

day6

day7

day8

day9

day10

day11

day12

day13

day14

day15

day16

day17

day18

day19

day20

day21

day22

day23

day24

day25

day26

day27

day28

day29

day30

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

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

相关文章

【核心算法篇十二】《深入解剖DeepSeek多任务学习:共享表示层的24个设计细节与实战密码 》

引言:为什么你的模型总在"精神分裂"? 想象你训练了一个AI实习生: 早上做文本分类时准确率90%下午做实体识别却把"苹果"都识别成水果公司晚上做情感分析突然开始输出乱码这就是典型的任务冲突灾难——模型像被不同任务"五马分尸"。DeepSeek通…

DeepSeek应用——与PyCharm的配套使用

目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回,且在本地模型报错 记录自己学习应用DeepSeek的过程,使用的是自己电脑本地部署的私有化蒸馏模型...... (举一反三,这个不单单是可以用…

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一种新型元启发式算法,其灵感来源于雪雁的迁徙行为,特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…

vscode通过ssh连接服务器实现免密登录+删除

文章目录 参考: 1、 vscode通过ssh连接服务器实现免密登录删除(吐血总结)

MySQL 主从复制原理及其工作过程

一、MySQL主从复制原理 MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器(主服务器,Master)复制到一个或多个 MySQL 数据库服务器(从服务器,Slave)的技术。以下简述其原理,主要包含三个核…

【赵渝强老师】Spark RDD的缓存机制

Spark RDD通过persist方法或cache方法可以将计算结果的缓存,但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD才会被缓存在计算节点的内存中并供后面重用。下面是persist方法或cache方法的函数定义: def pers…

设计模式相关知识点

目录 设计模式 设计模式 代码设计原则 设计模式 设计模式 干掉if...else,最好用的3种设计模式! | 小傅哥 bugstack 虫洞栈 代码设计原则-CSDN博客 23种设计模式-CSDN博客 策略模式(Strategy Pattern)-CSDN博客 责任链模式…

ShenNiusModularity项目源码学习(9:项目结构)

ShenNiusModularity源码主要有11个project(其实还有officialweb、test两个文件夹,大致有4、5个project,但看着跟主要项目代码没太大关系,暂时不管),这11个project的依赖关系如下图所示,其中最下…

ubuntu22.4搭建单节点es8.1

下载对应的包 elasticsearch-8.1.1-linux-x86_64.tar.gz 创建es租户 groupadd elasticsearc useradd elasticsearch -g elasticsearch -p elasticsearch chmod uw /etc/sudoers chmod -R elasticsearch:elasticsearch elasticsearch 修改配置文件 vim /etc/sysctl.conf vm…

Docker 部署 ollama + DeepSeek

拉取并运行 Ollama Docker 镜像 使用以下命令从 Docker Hub 拉取 Ollama 镜像并运行容器: docker run -d -p 11434:11434 --name ollama ollama/ollama -d:以守护进程模式运行容器,即让容器在后台运行。-p 11434:11434:将容器内…

解决DeepSeek服务器繁忙的有效方法

全球42%的企业遭遇过AI工具服务器过载导致内容生产中断(数据来源:Gartner 2025)。当竞品在凌晨3点自动发布「智能家居安装指南」时,你的团队可能正因DeepSeek服务器繁忙错失「净水器保养教程」的流量黄金期⏳。147SEO智能调度系统…

Discuz! X3.5 根目录权限设置

在 Discuz! X3.5 中,根目录的权限设置是确保网站安全性和功能正常运行的关键。如果权限设置不当,可能会导致文件无法访问、安全问题(如文件被篡改)或功能异常。以下是关于 Discuz! X3.5 根目录权限设置的详细说明和建议: 1. 根目录位置 Discuz! X3.5 的根目录通常是网站的…

【C++八股】内存对⻬

内存对齐是指编译器按照特定规则安排数据在内存中的存储位置,以提高程序的执行效率和可移植性。 内存对齐的原因: 1. 性能优化: 现代处理器通常要求数据在内存中按照特定的边界对齐,以提高内存访问效率。 如果数据未对齐&#x…

【有啥问啥】DeepSeek 技术原理详解

DeepSeek 技术原理详解 DeepSeek 是一款具有突破性技术的大型语言模型,其背后的技术原理涵盖了多个方面,以下是对其主要技术原理的详细介绍: 架构创新 多头潜在注意力机制(MLA) 传送门链接: DeepSeek V3中的Multi-…

ML.NET库学习008:使用ML.NET进行心脏疾病预测模型开发

文章目录 ML.NET库学习008:使用ML.NET进行心脏疾病预测模型开发1. 项目主要目的和原理2. 项目概述实现的主要功能:主要流程步骤:关键技术: 3. 主要功能和步骤数据加载与路径处理模型训练与评估模型保存与加载 4. 代码中的数据结构…

FFmpeg 全面知识大纲梳理

1. FFmpeg 简介 FFmpeg 是什么: 一个开源的多媒体处理框架,用于处理音频、视频和流媒体。支持多种格式和编解码器。提供命令行工具和库(如 libavcodec, libavformat, libavfilter 等)。主要功能: 格式转换编解码流媒体处理音视频剪辑、合并、分离添加滤镜、特效压缩与优化…

人工智能基础之数学基础:01高等数学基础

函数 极限 按照一定次数排列的一列数:“,“,…,"…,其中u 叫做通项。 对于数列{Un}如果当n无限增大时,其通项无限接近于一个常数A,则称该数列以A为极限或称数列收敛于A,否则称数列为发散, 极限值 左…

从零搭建微服务项目Base(第5章——SpringBoot项目LogBack日志配置+Feign使用)

前言: 本章主要在原有项目上添加了日志配置,对SpringBoot默认的logback的配置进行了自定义修改,并详细阐述了xml文件配置要点(只对日志配置感兴趣的小伙伴可选择直接跳到第三节),并使用Feign代替原有RestT…

【关于电商数据采集】电商数据采集的市场应用及发展

## 电商数据采集应用行业介绍 **一、 行业概述** 电商数据采集应用行业是指利用技术手段,自动或半自动地从电商平台、社交媒体等渠道获取商品信息、用户评论、销售数据等信息的行业。随着电子商务的蓬勃发展,数据已成为电商企业的重要资产,…

c++进阶———继承

1.引言 在一些大的项目中,我们可能要重复定义一些类,但是很麻烦,应该怎么办呢?举个简单的例子,我要做一个全校师生统计表,统计学号,教师编号,姓名,年龄,电话…