当前位置: 首页 > article >正文

MySQL 面试知识点详解(索引、存储引擎、事务与隔离级别、MVCC、锁机制、优化)

一、索引基础概念

1 索引是什么?
  • 定义:索引是帮助MySQL高效获取数据的有序数据结构,类似书籍的目录。
  • 核心作用:减少磁盘I/O次数,提升查询速度(以空间换时间)。
2 索引的优缺点
优点缺点
加速查询(WHERE、JOIN、ORDER BY)占用磁盘空间
保证数据唯一性(唯一索引)增删改操作变慢(维护索引)
加速表间连接过多索引增加优化器选择成本

2、索引数据结构

1. B+树(默认结构)
  • 特点

    • 多叉平衡树,层数少(3~4层可存千万级数据)。
    • 叶子节点存储数据(InnoDB存主键值或完整数据行)。
    • 叶子节点通过指针串联,支持范围查询。
  • B+树 vs B树

    对比项B+树B树
    数据存储位置仅叶子节点存数据所有节点均可存数据
    查询稳定性稳定(查询路径长度一致)不稳定
    范围查询高效(叶子节点链表连接)需中序遍历
2. 哈希索引(MEMORY引擎)
  • 特点
    • 基于哈希表,精确查询O(1)时间复杂度。
    • 不支持范围查询和排序,仅适合等值查询。

3、索引类型与使用场景

1. 索引分类
类型说明示例
主键索引唯一标识,不允许NULLPRIMARY KEY (id)
唯一索引列值唯一,允许NULLUNIQUE KEY (email)
普通索引无唯一性约束INDEX idx_name (name)
联合索引多列组合索引INDEX idx_age_name (age,name)
全文索引文本内容分词搜索(InnoDB支持)FULLTEXT (content)
2. 聚簇索引 vs 非聚簇索引
对比项聚簇索引(InnoDB)非聚簇索引(MyISAM)
数据存储索引与数据文件绑定索引与数据文件分离
主键查询直接定位数据行需回表查询(二次查找)
叶子节点内容存储完整数据行存储数据行的物理地址

二、存储引擎

1. InnoDB vs MyISAM
特性InnoDBMyISAM
事务支持✅ ACID 事务支持❌ 不支持事务
锁机制行级锁(默认)、表级锁、间隙锁表级锁(读锁/写锁)
外键约束✅ 支持❌ 不支持
崩溃恢复✅ Redo/Undo Log 保证数据恢复❌ 需手动修复表
全文索引✅(5.6+版本)✅ 原生支持
适用场景高并发读写、OLTP(如电商、支付)读多写少、静态数据(如日志、报表)
文件结构.ibd(数据+索引).frm(表结构)、.MYD(数据)、.MYI(索引)

核心区别

  • 事务与锁粒度:InnoDB 通过行级锁和 MVCC 支持高并发,MyISAM 表锁在写入时阻塞其他操作。
  • 数据完整性:InnoDB 支持外键约束和崩溃自动恢复,MyISAM 无此功能。
2. 其他存储引擎
  • MEMORY:数据存储在内存中,读写极快但重启丢失,适用于临时表或缓存。
  • ARCHIVE:压缩存储历史数据,适合归档场景,不支持索引。

三、事务与隔离级别

1. ACID 特性
  • 原子性(Undo Log):事务操作要么全成功,要么全失败。
  • 一致性:事务前后数据满足完整性约束(如主键唯一)。
  • 隔离性(MVCC + 锁):通过隔离级别控制并发事务的可见性。
  • 持久性(Redo Log):事务提交后数据持久化到磁盘。
2. 隔离级别与问题
隔离级别脏读不可重复读幻读实现方式
读未提交无锁
读已提交 (RC)MVCC + 行锁
可重复读 (RR)❌(InnoDB 通过间隙锁解决)MVCC + 间隙锁
串行化表级锁

四、MVCC(多版本并发控制)

MySQL中的MVCC(多版本并发控制)是一种用于提高数据库并发性能的机制,通过维护数据的多个版本来实现非锁定读,从而减少读写操作的冲突。

1. MVCC 的核心思想

MVCC允许不同事务看到数据的不同版本,通过为每个修改操作创建新版本(而非直接覆盖旧数据),实现读写操作的并发执行。读操作访问快照(历史版本),写操作创建新版本,从而避免加锁阻塞。


2. MVCC 的核心组件

(1)隐藏字段

InnoDB为每行数据添加两个隐藏字段:

  • DB_TRX_ID:记录最后一次修改该行的事务ID。
  • DB_ROLL_PTR:回滚指针,指向该行的上一个版本(Undo Log中的记录)。
(2)Undo Log
  • 作用:存储数据的历史版本,用于事务回滚和MVCC读取旧版本。
  • 结构:每次修改操作(INSERT/UPDATE/DELETE)均生成对应的Undo Log,形成版本链。例如:
    • INSERT操作记录删除的Undo Log。
    • DELETE操作记录插入的Undo Log。
    • UPDATE操作记录反向更新的Undo Log。
  • 清理机制:当无事务需要旧版本时,通过Purge线程清理过期Undo Log。
(3)Read View(一致性视图)
  • 作用:决定事务能看到哪些数据版本,根据隔离级别生成不同策略。
  • 结构
    • m_ids:生成Read View时活跃(未提交)的事务ID列表。
    • min_trx_id:活跃事务中的最小ID。
    • max_trx_id:下一个将分配的事务ID(当前最大ID+1)。
    • creator_trx_id:创建该Read View的事务ID(仅当自身有修改时存在)。

3. 数据可见性判断规则

事务通过Read View检查数据行的DB_TRX_ID,判断版本可见性:

  1. 已提交且早于所有活跃事务
    trx_id < min_trx_id → 可见。
  2. 由当前事务自身修改
    trx_id == creator_trx_id → 可见。
  3. 未提交或在Read View之后开启
    trx_id >= max_trx_id → 不可见。
  4. 活跃事务中的未提交修改
    trx_idm_ids列表中 → 不可见。
  5. 已提交但位于活跃事务范围内
    其他情况 → 可见。

事务遍历版本链,直到找到满足条件的版本或链尾(表示数据不可见)。


4. 不同隔离级别的实现

  • READ COMMITTED
    每次SELECT生成新的Read View,总能读取最新提交的数据。
  • REPEATABLE READ(默认):
    首次SELECT生成Read View,后续读操作复用该视图,保证可重复读。
  • SERIALIZABLE
    退化为加锁读写,不使用MVCC。

5. MVCC 工作流程示例

假设事务A(ID=100)执行查询:

  1. 生成Read View:活跃事务ID列表为[150, 160],min_trx_id=150max_trx_id=200
  2. 读取数据行
    • 当前行DB_TRX_ID=90(小于150且未在活跃列表)→ 可见。
    • 若行DB_TRX_ID=170(介于150-200且不在活跃列表)→ 可见。
    • 若行DB_TRX_ID=150(在活跃列表中)→ 不可见,沿版本链查找更早版本。

五、锁机制

1. 锁类型
分类维度类型说明
操作粒度表锁锁定整张表(MyISAM 默认),并发度低。
行锁锁定单行数据(InnoDB 默认),并发度高,但可能死锁。
锁模式共享锁(S锁)允许其他事务读,阻止写操作(SELECT ... LOCK IN SHARE MODE)。
排他锁(X锁)阻止其他事务读写(SELECT ... FOR UPDATE)。
锁范围间隙锁锁定索引记录的间隙,防止插入(解决幻读)。
意向锁表级锁,用于快速判断表中是否存在行锁(IS/IX 锁)。
2. 锁优化建议
  • InnoDB
    • 通过索引减少锁范围,避免全表扫描。
    • 控制事务大小,减少锁持有时间。
  • MyISAM
    • 设置 low_priority_updates=1 提升读优先级。
    • 启用并发插入(concurrent_insert=1)减少写阻塞。

六、数据库优化

1. SQL 优化
  • 索引优化
    • 避免 SELECT *,使用覆盖索引减少回表。
    • 联合索引遵循最左前缀原则。
  • 查询优化
    • 避免 LIKE '%前缀',改用全文索引或倒排索引。
    • 拆分复杂查询,减少临时表使用。
2. 架构优化
  • 读写分离:主库处理写操作,从库处理读操作。
  • 分库分表:按业务或数据量分片(如水平分表)。
  • 缓存策略:使用 Redis 缓存热点数据,减少数据库压力。
3. 设计优化
  • 字段类型:优先使用整型、ENUM 替代字符串,减少存储空间。
  • 避免 NULL:NULL 增加查询复杂度,尽量设置默认值。

七、高频面试题

  1. InnoDB 如何解决幻读?

    • RR 隔离级别下,通过 间隙锁 锁定索引范围,阻止其他事务插入新数据。
  2. 什么是 MVCC?

    • 多版本并发控制,通过事务版本链和 ReadView 实现非锁定读,减少锁冲突。
  3. 如何避免死锁?

    • 按固定顺序访问资源,减少事务粒度,设置合理的超时时间。
  4. 索引失效的常见场景?

    • 对索引列使用函数或运算,OR 连接非索引列,隐式类型转换。
  5. MySQL中的日志系统

    • Bin Log:用于主从复制和数据恢复(逻辑日志)。
    • Redo Log:保证事务持久性(物理日志)。
    • Undo Log:保证事务原子性(逻辑日志)。

相关文章:

MySQL 面试知识点详解(索引、存储引擎、事务与隔离级别、MVCC、锁机制、优化)

一、索引基础概念 1 索引是什么&#xff1f; 定义&#xff1a;索引是帮助MySQL高效获取数据的有序数据结构&#xff0c;类似书籍的目录。核心作用&#xff1a;减少磁盘I/O次数&#xff0c;提升查询速度&#xff08;以空间换时间&#xff09;。 2 索引的优缺点 优点缺点加速…...

Linux / Windows 下 Mamba / Vim / Vmamba 安装教程及安装包索引

目录 背景0. 前期环境查询/需求分析1. Linux 平台1.1 Mamba1.2 Vim1.3 Vmamba 2. Windows 平台2.1 Mamba2.1.1 Mamba 12.1.2 Mamba 2- 治标不治本- 终极版- 高算力版 2.2 Vim- 治标不治本- 终极版- 高算力版 2.3 Vmamba- 治标不治本- 终极版- 高算力版 3. Linux / Windows 双平…...

deepseek v3-0324 Markdown 编辑器 HTML

Markdown 编辑器 HTML 以下是一个美观的 Markdown 编辑器 HTML 页面&#xff0c;支持多种主题切换和实时预览功能&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&q…...

视频设备轨迹回放平台EasyCVR如何搭建公共娱乐场所远程视频监控系统

一、背景介绍 由于KTV、酒吧、足疗店等服务场所人员流动频繁、环境复杂&#xff0c;一直是治安管理的重点区域。为有效打击 “黄赌毒”、打架斗殴、寻衅滋事等违法犯罪的活动&#xff0c;打造安全有序的娱乐消费环境&#xff0c;我国相关部门将加大对这类场所的清查与管控力度…...

网络安全基础知识总结

什么是网络安全 采取必要措施&#xff0c;来防范对网络的攻击&#xff0c;侵入&#xff0c;干扰&#xff0c;破坏和非法使用&#xff0c;以及防范一些意外事故&#xff0c;使得网络处于稳定可靠运行的状态&#xff0c;保障网络数据的完整性、保密性、可用性的能力(CIA)。 举例…...

Python设计模式:克隆模式

1. 什么是克隆模式 克隆模式的核心思想是通过复制一个已有的对象&#xff08;原型&#xff09;来创建一个新的对象&#xff08;克隆&#xff09;。这种方式可以避免重复的初始化过程&#xff0c;从而提高效率。克隆模式通常涉及以下几个方面&#xff1a; 原型对象&#xff1a…...

【工具】在 Visual Studio 中使用 Dotfuscator 对“C# 类库(DLL)或应用程序(EXE)”进行混淆

在 Visual Studio 中使用 Dotfuscator 进行混淆 Dotfuscator 是 Visual Studio 自带的混淆工具&#xff08;Dotfuscator Community Edition&#xff0c;简称 CE&#xff09;。它可以混淆 C# 类库&#xff08;DLL&#xff09;或应用程序&#xff08;EXE&#xff09;&#xff0c…...

积分赛——获取环境温度

设计要求 从DS18B20温度传感器上获取环境温度&#xff0c;并将其温度值显示到数码管上&#xff08;保留两位小数&#xff09;。 当“S4”定义为发送按键&#xff0c;按键S4按下时&#xff0c;串口向PC端发送当前采集的温度值&#xff1b; 串口发送格式&#xff1a; Temp:26.…...

LogicFlow获取锚点数据的自定义key并添加的连接的Edge边数据中

1、重写 PolylineEdgeModel 类&#xff08;其它 EdgeModel 都可以&#xff09; class CustomNetWorkNodeEdge extends PolylineEdge { } class CustomNetWorkNodeEdgeModel extends PolylineEdgeModel {getData() {const data super.getData();//获取开始锚点自定义属性添加到…...

【python中级】解压whl文件内容

【python中级】解压whl文件内容 1.背景2.解压1.背景 【python中级】关于whl文件的说明 https://blog.csdn.net/jn10010537/article/details/146979236 补充以上博客: 在 旧版 setuptools 中(< v58),如果想生成 .whl,必须先pip install 安装 wheel 三方包! pip inst…...

Xilinx系列FPGA实现HDMI2.1视频收发,支持8K@60Hz分辨率,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我已有的4K/8K视频处理解决方案我已有的FPGA图像处理方案 3、详细设计方案设计框图硬件设计架构本HDMI2.1性能参数8K视频输入源Video PHY ControllerHDMI 2.1 Receive…...

如何把网页文章转为pdf保存

fnF12调出右边网页端的控制台 在下面输入代码 1、转CSDN上的文章 (function(){ use strict;var articleBox $("div.article_content");articleBox.removeAttr("style");var head_str ""; var foot_str ""; var olde…...

开源可视化大屏go-view前后端安装

一、后端安装 下载代码 git clone https://gitee.com/MTrun/go-view-serve修改配置 cd go-view-serve/ # 修改application-dev.yml的数据库文件地址 vi ./src/main/resources/application-dev.ymlapplication-dev.yml spring:datasource:driver-class-name: org.sqlite.JDB…...

eventEmitter实现

没有做任何异常处理,简单模拟实现 事件对象的每一个事件都对应一个数组 /*__events {"事件1":[cb1,cb2],"事件2":[cb3,cb4],"事件3":[...],"事件4":[...],};*/class E{__events {};constructor(){}//注册监听回调on(type , callbac…...

自然语言处理|如何用少样本技术提升低资源语言处理?

一、引言 在全球化的背景下&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术取得了显著进展&#xff0c;为人们的生活和工作提供了便利。然而&#xff0c;大多数 NLP 研究和应用集中在少数高资源语言上&#xff0c;如英语和中文。据统计&#xff0c;全球存在超过 700…...

系统安全——文件监控-FileMonitor

namespace FileSystemWatcherDemo {public partial class Form1 : Form{ public Form1(){InitializeComponent();UsingFileSystemWatcher();} /// <summary>/// 使用FileSystemWatcher方法/// </summary>void UsingFileSystemWatcher(){//6.2//FileSystemWa…...

07-01-自考数据结构(20331)- 排序-内部排序知识点

内部排序算法是数据结构核心内容,主要包括插入类(直接插入、希尔)、交换类(冒泡、快速)、选择类(简单选择、堆)、归并和基数五大类排序方法。 知识拓扑 知识点介绍 直接插入排序 定义:将每个待排序元素插入到已排序序列的适当位置 算法步骤: 从第二个元素开始遍历…...

Unity:平滑输入(Input.GetAxis)

目录 1.为什么需要Input.GetAxis&#xff1f; 2. Input.GetAxis的基本功能 3. Input.GetAxis的工作原理 4. 常用参数和设置 5. 代码示例&#xff1a;用GetAxis控制角色移动 6. 与Input.GetAxisRaw的区别 7.如何优化GetAxis&#xff1f; 1.为什么需要Input.GetAxis&…...

【AI学习】MCP的简单快速理解

最近&#xff0c;AI界最火热的恐怕就是MCP了。作为一个新的知识点&#xff0c;学习的开始&#xff0c;先摘录一些信息&#xff0c;从发展历程、通俗介绍到具体案例&#xff0c;这样可以快速理解MCP。 MCP发展历程 来自i陆三金 Anthropic 开发者关系负责人 Alex Albert&#…...

单机快速部署开源、免费的分布式任务调度系统——DolphinScheduler

看了DolphinScheduler的介绍&#xff0c;不知道有没有引起你的兴趣&#xff0c;有没有想要上手体验一番呢。本文则主要为大家介绍DolphinScheduler的单机部署方式&#xff0c;方便大家快速体验。 环境准备 需要Java环境&#xff0c;这是一个老生常谈的问题&#xff0c;关于Ja…...

Vue3命名规范指南

在 Vue 3 中&#xff0c;遵循一致的命名规范可以提高代码的可读性和维护性。以下是常见的命名规范和实践建议&#xff1a; 1. 组件命名 PascalCase&#xff08;大驼峰式&#xff09; 单文件组件&#xff08;.vue 文件&#xff09;和组件引用时推荐使用 PascalCase&#xff0c;便…...

【大模型系列篇】大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器

今天我们将使用FastAPI来构建 MCP 服务器&#xff0c;Anthropic 推出的这个MCP 协议&#xff0c;目的是让 AI 代理和你的应用程序之间的对话变得更顺畅、更清晰。FastAPI 基于 Starlette 和 Uvicorn&#xff0c;采用异步编程模型&#xff0c;可轻松处理高并发请求&#xff0c;尤…...

springcloud configClient获取configServer信息失败导致启动configClient注入失败报错解决

目录 一、问题现象 二、解决方案 三、运行结果 四、代码地址 一、问题现象 springcloud configClient获取configServer信息失败导致启动configClient注入失败 报错堆栈信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name scop…...

HarmonyOS-ArkUI Rcp模块类关系梳理

前言 本文重点解决的是&#xff0c;按照官网学习路径学习Tcp模块内容时&#xff0c;越看越混乱的问题。仿照官网案例&#xff0c;书写代码时&#xff0c;产生的各种疑惑。比如&#xff0c;类与类之间的关系&#xff0c;各种配置信息究竟有多少&#xff0c;为什么越写越混乱。那…...

26考研——线性表_ 线性表的链式表示_双循环链表(2)

408答疑 文章目录 三、 线性表的链式表示双循环链表单链表与双链表的比较单链表的特点双链表的特点 双链表上基本操作的实现双链表的插入操作双链表的删除操作 双链表的代码实操定义结点创建一个结点带头结点的双链表初始化创建双链表打印双链表查找结点插入结点在指定节点后插…...

大模型如何引爆餐饮与电商行业变革

大模型如何引爆餐饮与电商行业变革&#xff1f; 一、时代背景&#xff1a;大模型重构产业逻辑的底层动力 1. 技术跃迁催生效率革命 2025年&#xff0c;大模型技术迎来"普惠临界点"。李开复在中关村论坛指出&#xff0c;大模型推理成本每年降低10倍&#xff0c;使得…...

基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 这些年随着Internet的迅速发展&#xff0c;我们国家和世界都已经进入了互联网大数据时代&#xff0c;计算机网络已经成为了整个社会以及经济发展的巨大动能&#xff0c;考研成绩查询管理事务现在已经成为社会关注的重要内容&#xff0c;因此运用互联网技术来提高考研成绩…...

es自定义ik分词器中文词库实现热更新

基于web地址的方式实现ik分词热更新。 操作系统&#xff1a;win 11 es version&#xff1a;8.6.2 ik version&#xff1a;8.6.2 1、创建web服务&#xff0c;并提供ik查询词库接口 编写分词http url代码&#xff0c;返回自定义分词内容分词词库数据来自业务需求&#xff0c;存…...

OpenStack 卷虚拟机跨租户迁移方案

目标&#xff1a;迁移租户A的卷虚机到租户B 场景&#xff1a;使用卷虚拟机&#xff0c;租户a和b使用相同网络 租户A的操作&#xff1a; 1.记录虚拟机的ip地址&#xff0c;Mac信息&#xff0c; nova interface-list neutron port-show 2.对虚拟机进行关机操作&#xff0c;将…...

添加购物车功能

业务需求&#xff1a; 用户提交三个字段&#xff0c;服务端根据提交的字段判断是菜品还是套餐&#xff0c;根据菜品或者套餐添加购物车表中。 代码实现 RestController Slf4j RequestMapping("/user/shoppingCart") public class ShoppingCartController {Autowired…...