猿辅导MySQL面试常见问题解析(一)

作者:360_go_php日期:2025/10/23

在进行MySQL相关的面试时,尤其是在如猿辅导这样注重技术底层实现的公司,面试官往往会问一些关于数据库优化、事务管理、锁机制等方面的问题。以下是一些常见的MySQL面试问题及其详细解答,帮助你更好地准备面试。​编辑


1. MySQL建立索引的原则​编辑

在MySQL中,索引是提升查询性能的重要工具。然而,索引虽然能加速查询,但也会占用额外的空间,并且会影响写操作的性能。因此,建立索引时需要遵循一些原则:

  • 选择性高的列:选择性高的列,指的是该列的唯一值多,数据分布较为均匀。对于这些列建立索引,能有效提高查询性能。
  • 频繁查询的列:对于频繁用于WHEREORDER BYJOIN等条件的列,应该考虑建立索引。
  • 范围查询避免使用索引:范围查询(如BETWEEN><等)可能会导致索引的效率降低,尤其是在大数据量的情况下。如果查询是范围条件,尽量避免在范围查询列上使用索引。
  • 复合索引的选择:在有多个查询条件的情况下,复合索引(多个列的索引)比单列索引更有效。复合索引的顺序应根据查询条件的顺序来排列。
  • 避免过多索引:虽然索引能够提高查询效率,但过多的索引会增加数据库的存储空间,且会影响INSERT、UPDATE、DELETE等操作的性能,因此需要合理规划索引。

2. 聚簇索引和非聚簇索引区别​编辑

在MySQL中,索引有两种主要的类型:聚簇索引(Clustered Index)和非聚簇索引(Non-clustered Index)。它们之间有以下几个区别:

  • 数据存储方式
    - 聚簇索引:数据表的实际数据存储与索引存储在同一结构中。表的行按照索引的顺序存储,叶节点存储的是数据行本身,因此聚簇索引的顺序就是表数据的顺序。
    - 非聚簇索引:索引结构独立于数据表的存储。非聚簇索引的叶节点存储的是数据行的指针(即数据行的地址或主键),而不是数据行本身。
  • 索引类型
    - 聚簇索引:每个表只能有一个聚簇索引,通常是主键索引。主键索引是聚簇索引的一种特殊形式。
    - 非聚簇索引:可以有多个非聚簇索引,通常是针对查询中经常出现的条件列创建的索引。
  • 性能差异
    - 聚簇索引:因为数据存储和索引存储在同一结构中,查询时可以直接获取数据,因此性能较高。
    - 非聚簇索引:查询时需要通过索引查找数据的指针,然后再去数据表中获取数据,性能相对较低。

3. B+树结构,为什么不用B树或二叉树

MySQL索引通常使用B+树结构,B+树是对B树的优化,它相比于B树有以下优点:

  • 叶节点存储数据:B+树的所有数据都存储在叶节点,而非B树中数据存在各级节点中。这样可以大大减少查找的时间,因为只需要查找到叶节点即可。
  • 顺序遍历:B+树的叶节点之间通过指针连接,支持顺序遍历。对于范围查询(如BETWEEN>等),B+树比B树更加高效。
  • 更高的扇出性:B+树的内节点不存储数据,只存储索引值,通常可以包含更多的子节点,因此B+树的扇出性更高,树的高度更小,查询效率更高。
  • 相比于二叉树:二叉树的查找效率为O(logN),但是其结构不如B树、B+树平衡,且由于其左右子树只能有两个分支,扇出性较差,因此不适用于大量数据的存储和检索。

4. 事务四大特性​编辑

事务(Transaction)是数据库管理系统中的一个重要概念,保证了操作的原子性、一致性、隔离性和持久性,简称ACID特性:

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不做。如果事务中的某个操作失败,整个事务会回滚,保证数据的一致性。
  • 一致性(Consistency):事务执行前后,数据库的状态是一致的。即事务的执行不会破坏数据库的完整性约束。
  • 隔离性(Isolation):事务的执行不应受到其他事务的干扰。不同事务之间的操作是相互独立的。MySQL通过事务隔离级别来控制并发事务的隔离性。
  • 持久性(Durability):一旦事务提交,对数据库的修改就是永久性的,不会丢失,即使发生系统崩溃,提交的事务也能够保证被保存。

5. 事务隔离级别​编辑

事务的隔离级别决定了一个事务可以看到其他事务未提交的修改。MySQL提供了以下四种事务隔离级别:

  • 读未提交(READ UNCOMMITTED):最低的隔离级别,事务可以读取到其他事务未提交的修改,可能会导致脏读、不可重复读、幻读等问题。
  • 读已提交(READ COMMITTED):事务只能读取到其他事务已经提交的数据,避免了脏读,但仍然可能会发生不可重复读和幻读。
  • 可重复读(REPEATABLE READ):事务在执行过程中,读取的数据不会被其他事务修改,避免了脏读和不可重复读,但仍然可能发生幻读。
  • 串行化(SERIALIZABLE):最高的隔离级别,事务完全串行化执行,避免了所有的并发问题,包括脏读、不可重复读和幻读,但性能较差。

6. 用MySQL实现一个分布式锁

实现分布式锁的常见方法是利用MySQL的SELECT ... FOR UPDATE语句。通过锁住数据库中的一行数据,来保证同一时刻只有一个客户端能够获取到锁。

1-- 1. 创建一个锁表  
2CREATE TABLE locks (  
3    lock_name VARCHAR(255) PRIMARY KEY,  
4    locked INT  
5);
6
7-- 2. 获取锁  
8START TRANSACTION;  
9SELECT * FROM locks WHERE lock_name = 'my_lock' FOR UPDATE;  
10-- 如果查询结果为空,可以插入一条记录来表示锁定  
11INSERT INTO locks (lock_name, locked) VALUES ('my_lock', 1) ON DUPLICATE KEY UPDATE locked = 1;  
12COMMIT;
13
14-- 3. 释放锁  
15START TRANSACTION;  
16UPDATE locks SET locked = 0 WHERE lock_name = 'my_lock';  
17COMMIT;  
18

这个方法使用FOR UPDATE语句锁定了locks表中的一行记录,从而实现分布式锁。


7. MVCC具体原理​编辑

MVCC(多版本并发控制)是MySQL实现事务隔离的机制,常用于InnoDB存储引擎中。

  • 原理:MVCC通过为每行数据维护多个版本来实现并发控制。每个事务对数据的操作都会生成一个新的版本,并且每个版本都包含了事务的开始时间和结束时间(或提交时间)。这样,事务在执行过程中可以看到自己的数据修改,但看不到其他事务未提交的数据。
  • 实现
    - Undo Log:记录了数据修改的前一个版本,用于回滚操作。
    - 系统版本号:每个事务都有一个唯一的ID,数据库通过该ID来区分哪些数据版本对当前事务可见。
  • 可见性判断:每个事务在查询数据时,都会根据当前事务的ID来判断某个数据版本是否可见。

总结

掌握MySQL的基础原理与高级特性是面试成功的关键,尤其是在涉及性能优化、事务控制和分布式系统设计时,良好的数据库理解能够使在面试中脱颖而出。


猿辅导MySQL面试常见问题解析(一)》 是转载文章,点击查看原文


相关推荐


Swift 字符串与字符完全导读(二):Unicode 视图、索引系统与内存陷阱
unravel20252025/10/22

Unicode 的三种编码视图 Swift 把同一个 String 暴露成 4 种迭代方式: 视图元素类型单位长度典型用途StringCharacter人眼“一个字符”业务逻辑utf8UInt81~4 字节网络/文件 UTF-8 流utf16UInt162 或 4 字节与 Foundation / Objective-C 交互unicodeScalarsUnicodeScalar21-bit精确到标量,做编码分析 代码一览 l


AWS EKS 集成Load Balancer Controller 对外暴露互联网可访问API [AWS 中国宁夏区]
thinktik2025/10/20

本文主要介绍AWS EKS和AWS Elastic Load Balancing的集成;我们可以通过AWS ELB将运行在EKS中的服务暴露出去,供互联网访问。 AWS ELB提供的负载均衡,高可用,按流量自动弹性和自带的安全性服务(比如基础版的AWS Shield)给为我们的网络服务提供了高质量的保证。虽然我们也可以直接让K8S Service服务直接以public ip的方式来对外服务,但是一般技术和成本等综合来考虑不如AWS ELB。 如下图,AWS ELB充当运行在AWS上的动态API服


AI环境下的网络安全人才的发展方向
Mr_Meng_De2025/10/19

2025年9月16日,2025年国家网络安全宣传周分论坛上发布《AI时代网络安全产业人才发展报告(2025)》。 《报告》由工业和信息化部教育与考试中心、安恒信息、中国联合网络通信有限公司软件研究院、全国数字安全行业产教融合共同体、中国网络空间新兴技术安全创新论坛、智联招聘、中国网络空间安全人才教育论坛联合编制。 AI驱动网络安全领域岗位革新与挑战升级 随着人工智能技术与网络安全行业的深度融合,当代大学生对这一技术变革带来的就业影响形成了较为全面的认知。约三分之一(33.5%)的学生表现出


策略模式:让算法选择像点菜一样简单
太过平凡的小蚂蚁2025/10/18

什么是策略模式? ​策略模式(Strategy Pattern)​​ 是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。 简单来说:​定义策略家族,让客户端自由选择。​​ 现实世界类比 想象你去餐厅吃饭: ​策略接口​:点菜这个行为 ​具体策略​:中餐、西餐、日料等不同菜系 ​上下文​:餐厅(提供点菜环境) ​客户端​:你(根据心情选择今天吃什么) 模式结构 classDiagra


VSCODE GDB调试
Gary Studio2025/10/16

流程 1.首先点击左侧的小虫子按钮 2.选择gdb调试 3.在program一栏填上你需要调试的可执行文件 注意:编译的时候记得在编译命令的最后或者在前面的语句中添加-g 增加调试的选项 例如下面 PS D:\CODE\c> gcc .\04_example2.c -o .\04_example2 -g 4.在需要调试的代码打上断点即可开启运行。 补充 有时候运行不起来有可能是没有安装gdb或者是gdb的环境变量没有配置造成的 验证gdb是否安装 输入以下指令


SpringBoot实现JWT动态密钥轮换
风象南2025/10/15

背景:为什么 JWT 密钥也要"轮换" JWT(JSON Web Token) 是当代认证体系的常用方案, 无论是单体系统、微服务、还是前后端分离登录,几乎都会用到它。 但在大多数系统里,签名密钥往往是一成不变的—— 一旦生成,常年不换,代码里写死或放在配置文件中。 这其实非常危险: 一旦密钥被误传或泄露,攻击者就能伪造任意用户的合法 Token 无论是测试环境误配置,还是日志误打出 key,都可能导致密钥泄露,带来安全隐患 于是我们面临一个工程问题: "如何能动态更新 JWT 签名密钥,


从Java集合到云原生现代数据管理的演进之路
kkjt01302025/10/14

从Java集合到云原生现代数据管理的演进之路在软件开发的漫长历程中,数据管理技术的演进一直是推动应用架构变革的核心动力。从最初在单一应用内存中操作的Java集合,到今天跨越全球分布式环境的云原生数据平台,这条路不仅反映了技术的飞跃,更体现了我们对数据处理能力、规模和敏捷性不断增长的需求。这一演进是渐进而深刻的,每一步都为了解决特定时代的核心挑战。Java集合:单机时代的基石Java集合框架(Java Collections Framework, JCF)是早期Java应用数据管理的基石。它以Li


如何为Spring Cloud Gateway配置具体的负载均衡策略?
IT橘子皮2025/10/12

以下是针对 ​Spring Cloud Gateway​ 配置具体负载均衡策略(如加权轮询、最小连接数等)的详细指南,结合最新技术文档和最佳实践: 一、基础配置与依赖 1. ​引入依赖​ 确保项目中已包含 Spring Cloud Gateway 和负载均衡器(Spring Cloud LoadBalancer)的依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cl


零基础学JavaScript:手把手带你搭建环境,写出第一个程序!
良山有风来2025/10/11

开头:你是不是也遇到过这些问题? 刚学JavaScript的时候,你是不是一脸懵? 打开教程,满屏的“Node.js”、“npm”、“VS Code”,完全不知道从哪下手? 照着网上的教程配置环境,结果各种报错,心态爆炸? 写了半天代码,连个“Hello World”都显示不出来? 别担心!这篇文章就是为你准备的。 我会用最直白的方式,带你一步步搭建JavaScript开发环境,并写出你的第一个程序。 看完这篇文章,你不仅能顺利运行第一个JavaScript程序,还能理解背后的原理,为后续学习打


【机器学习】无监督学习 —— K-Means 聚类、DBSCAN 聚类
一杯水果茶!2025/10/9

K-Means 聚类标准 K-Means 算法K-Means 评估:肘部法则(Elbow Method)与轮廓系数(Silhouette Score)1. 肘部法则(Elbow Method)2. 轮廓系数(Silhouette Score) DBSCAN 聚类(Density-Based Spatial Clustering of Applications with Noise)DBSCAN 的关键参数DBSCAN 算法 K-Means 聚类 K‑Means 聚类 是一种

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0