MySQL 索引与事务详解

目录

一、索引(Index)

二、事务(Transaction)

三、总结


一、索引(Index

索引的本质:一种数据结构(如 B+TreeHash),用于快速定位数据,避免全表扫描。
核心作用:提升查询效率,但会牺牲一定的写性能(增删改需维护索引)。


1. 索引类型

  • B+Tree 索引(默认)
    • 特点:支持范围查询、排序、最左前缀匹配。
    • 适用场景:=, >, <, BETWEEN, ORDER BY, GROUP BY 等操作。
    • InnoDB 聚簇索引:数据直接存储在 B+Tree 叶子节点,主键即聚簇索引。
    • 非聚簇索引(二级索引):叶子节点存储主键值,需回表查询数据。
  • 哈希索引
    • 特点:O(1) 时间复杂度,仅支持精确匹配(=),不支持范围查询。
    • 适用场景:内存表(如 MEMORY 引擎)、等值查询频繁的场景。
    • 限制:哈希冲突、无法排序。
  • 全文索引(FULLTEXT)
    • 特点:基于分词技术,支持自然语言搜索。
    • 适用场景:MATCH() ... AGAINST 全文检索(如文章内容搜索)。
    • 引擎支持:MyISAM 和 InnoDB(5.6+)。
  • 空间索引(R-Tree)
    • 适用场景:地理空间数据(如经纬度查询)。
    • 引擎支持:MyISAM。

2. 索引创建与使用

  • 创建语法

CREATE INDEX idx_name ON table(column);          -- 普通索引

CREATE UNIQUE INDEX idx_name ON table(column);   -- 唯一索引

ALTER TABLE table ADD PRIMARY KEY(column);       -- 主键索引

  • 联合索引(复合索引)
    • 最左前缀原则:索引 (a, b, c) 可生效于 a, a+b, a+b+c,但无法单独使用 b 或 c。
    • 覆盖索引:查询字段全部在索引中时,无需回表(性能最优)。
  • 索引失效场景
    • 对索引列进行运算或函数操作(如 WHERE YEAR(date) = 2023)。
    • 使用 LIKE 以通配符开头(如 LIKE '%abc')。
    • 数据类型隐式转换(如字符串列用数字查询)。
    • OR 连接非索引列(除非所有列均有索引)。
    • 优化器认为全表扫描更快(小表或低区分度数据)。

3. 索引优化建议

  1. 选择高区分度的列:区分度越高(如唯一键),过滤效果越好。
  2. 避免冗余索引:联合索引可替代多个单列索引。
  3. 控制索引长度:使用前缀索引(如 INDEX(column(10)))减少存储。
  4. 监控索引使用率:通过 SHOW INDEX FROM table 或 INFORMATION_SCHEMA.STATISTICS 分析。
  5. 执行计划分析:用 EXPLAIN 查看 type(访问类型)、key(使用索引)、Extra(是否覆盖索引)。

二、事务(Transaction

事务的本质:一组原子性操作的集合,保证数据一致性。
ACID 特性

  • Atomicity(原子性):事务全部成功或全部回滚。
  • Consistency(一致性):事务前后数据满足业务约束。
  • Isolation(隔离性):并发事务相互隔离。
  • Durability(持久性):事务提交后数据永久存储。

1. 事务隔离级别

隔离级别

脏读

不可重复读

幻读

实现机制

READ UNCOMMITTED

✔️

✔️

✔️

无锁,直接读最新数据

READ COMMITTED (RC)

✖️

✔️

✔️

快照读(MVCC)

REPEATABLE READ (RR)

✖️

✖️

快照读 + 间隙锁(InnoDB)

SERIALIZABLE

✖️

✖️

✖️

所有操作加锁

  • InnoDB 默认隔离级别:REPEATABLE READ(通过 MVCC + 间隙锁解决幻读)。
  • 幻读:RR 级别下,通过 SELECT ... FOR UPDATE 可能触发间隙锁,阻止其他事务插入。

2. 事务实现机制

  • Redo Log(重做日志)
    • 作用:保证持久性,记录物理修改(如页的修改)。
    • 写入流程:事务提交时先写 redo log(顺序写,高性能),再异步刷盘。
  • Undo Log(回滚日志)
    • 作用:保证原子性,记录数据修改前的版本,用于回滚或 MVCC。
    • 存储位置:InnoDB 的 undo tablespace。
  • MVCC(多版本并发控制)
    • 核心思想:每个事务看到的数据快照版本不同。
    • 实现细节
      • 隐藏字段:DB_TRX_ID(事务ID)、DB_ROLL_PTR(回滚指针)。
      • ReadView:事务启动时生成活跃事务ID列表,决定可见性。
      • RC vs RR:RC 每次读生成新 ReadView;RR 使用事务启动时的 ReadView。
  • 锁机制
    • 行锁:锁住单行数据(如 SELECT ... FOR UPDATE)。
    • 间隙锁(Gap Lock:锁住索引范围间隙,防止插入(解决幻读)。
    • 临键锁(Next-Key Lock:行锁 + 间隙锁,锁住左开右闭区间。

3. 事务最佳实践

  1. 控制事务长度:避免长事务占用锁资源,导致死锁或性能下降。
  2. 明确事务边界:业务逻辑中尽早提交或回滚。
  3. 合理选择隔离级别:根据业务需求权衡一致性与性能。
  4. 死锁处理
    • 设置 innodb_lock_wait_timeout 控制锁等待超时。
    • 使用 SHOW ENGINE INNODB STATUS 分析死锁日志。
  5. 避免隐式提交:如 DDL 语句(ALTER TABLE)会自动提交当前事务。

三、总结

  • 索引优化:根据查询模式设计索引,权衡读写性能,避免过度索引。
  • 事务设计:选择合适隔离级别,利用 MVCC 和锁机制平衡并发与一致性。
  • 监控工具:善用 EXPLAIN、SHOW PROFILE、INFORMATION_SCHEMA 等分析性能瓶颈。

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

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

相关文章

macOS Python 环境配置指南

1. 检查现有 Python 环境 python3 --version # 检查 Python 3 版本 pip3 --version # 检查 pip 版本 2. 安装 pyenv&#xff08;Python 版本管理工具&#xff09; # 使用 Homebrew 安装 pyenvbrew install pyenv# 配置 pyenv 环境变量&#xff08;添加到 ~/.zshrc&#…

游戏引擎学习第272天:显式移动转换

回顾并为今天的内容铺垫背景 我们刚开始为游戏主角编写一些程序逻辑&#xff0c;因为我们之前已经完成了大部分引擎方面的开发&#xff0c;现在可以专注在角色身上。这个角色的移动方式会有些特别&#xff0c;与大多数游戏角色的运动机制不太一样。我们当前正在实现的控制方式…

软件测试都有什么???

文章目录 一、白盒测试&#xff08;结构测试&#xff09;二、黑盒测试&#xff08;功能测试&#xff09;三、灰盒测试四、其他测试类型五、覆盖准则对比六、应用场景 软件测试主要根据测试目标、技术手段和覆盖准则进行分类。分为白盒测试、黑盒测试、灰盒测试及其他补充类型 一…

very_easy_sql(SSRF+SQL注入)

题目有一行提示&#xff1a; you are not an inner user, so we can not let you have identify~&#xff08;你不是内部用户&#xff0c;所以我们不能让你进行身份验证&#xff09;联想到可能存在SSRF漏洞&#xff0c;一般情况下&#xff0c;SSRF攻击的目标是外网无法访问的内…

国内外主流AI编程工具全方位对比分析(截至2025年5月)

一、国际主流工具对比 1. Windsurf&#xff08;Codeium公司&#xff09; 核心功能&#xff1a;代理型AI编程&#xff08;代码导航/修改/命令执行&#xff09;、浏览器DOM访问、网页研究功能语言支持&#xff1a;70语言&#xff0c;包括Python/Java/JavaScript/Rust等[[22-23]…

ARP协议的工作原理

文章目录 ARP协议的工作原理ARP报文&#xff08;以太网&#xff09;ARP高速缓存 ARP协议的工作原理 ARP协议的作用是实现任意网络层地址到任意物理地址转换。工作原理是&#xff1a; 主机向自己所在网络广播一个ARP请求&#xff0c;该请求包含目标机器的网络地址。处于该网络…

【小知识酷】《Matlab》考点精简

在线编译器 https://matlab.mathworks.com/?elqsidumic49viv8wu5r6fckew 第1章 matlab基础知识 第1节 输出函数 1. 使用disp函数 disp函数可用于输出变量的值或者字符串。 % 输出字符串 disp(Hello, MATLAB!); %显示Hello, MATLAB!% 输出变量 x 10; disp(x); %显示10% 输出数…

码蹄集——中庸之道(三个数比较)

MT1112 中庸之道 请编写一个简单程序&#xff0c;输入3个整数&#xff0c;比较他们的大小&#xff0c;输出中间的那个数 格式 输入格式&#xff1a; 输入整型&#xff0c;空格分隔 输出格式&#xff1a;输出整型 样例 1 输入&#xff1a;1 5 3 输出&#xff1a;3 比较…

快速搭建一个vue前端工程

一、环境准备 1、安装node.js 下载地址&#xff1a;Node.js 推荐版本如下&#xff1a; 2、检查node.js版本 node -v npm -v 二、安装Vue脚手架 Vue脚手架是Vue官方提供的标准化开发工具。vue官网&#xff1a;https://cn.vuejs.org/ 全局安装vue/cli &#xff08;仅第一次…

React Native基础环境配置

React Native基础环境配置 1.引言2.React-Native简介3.项目基础环境搭建1.引言 感觉自己掌握的知识面还是有点太窄了,于是决定看看移动端的框架,搞个react搭一个后端管理项目,然后拿react-native写个小的软件,试着找个三方上架一下应用市场玩玩。毕竟不可能一直在简历上挂一…

PHP和Composer 安装

Composer 是 PHP 的 依赖管理工具&#xff0c;就像&#xff1a; Node.js 用 npm Python 用 pip Java 用 maven 用来安装和管理 PHP 项目中需要用到的第三方库 安装PHP可以理解成 Java解释器 安装PHP PHP For Windows: Binaries and sources Releaseshttps://windows.php.n…

API请求参数有哪些?

通用参数 app_key&#xff1a;应用的唯一标识&#xff0c;用于验证应用身份&#xff0c;调用API时必须提供。 timestamp&#xff1a;请求时间戳&#xff0c;通常为当前时间的毫秒级时间戳&#xff0c;用于防止请求被重放攻击。 format&#xff1a;返回数据的格式&#xff0c;…

并发笔记-条件变量(三)

文章目录 背景与动机30.1 条件变量的定义与基本操作 (Definition and Routines)30.2 生产者/消费者问题 (Bounded Buffer Problem)30.3 覆盖条件 (Covering Conditions) 与 pthread_cond_broadcast30.4 总结 背景与动机 到目前为止&#xff0c;我们已经学习了锁 (Locks) 作为并…

stm32实战项目:无刷驱动

目录 系统时钟配置 PWM模块初始化 ADC模块配置 霍尔接口配置 速度环定时器 换相逻辑实现 主控制循环 系统时钟配置 启用72MHz主频&#xff1a;RCC_Configuration()设置PLL外设时钟使能&#xff1a;TIM1/ADC/GPIO时钟 #include "stm32f10x.h"void RCC_Configu…

LC-3 中常见指令

当然可以&#xff01;以下是 LC-3 中常见指令&#xff08;汇编格式&#xff09;与对应的二进制编码格式 的总结表&#xff0c;通俗易懂地介绍每条指令的用途、操作码&#xff08;opcode&#xff09;以及格式结构。 ✅ 常见 LC-3 指令与对应的二进制格式 指令名称操作码&#x…

深入解析Docker:核心架构与最佳实践

文章目录 前言一、Docker 解决了什么问题&#xff1f;二、Docker 底层核心架构2.1 Docker 引擎的分层架构2.2 镜像的奥秘&#xff1a;联合文件系统&#xff08;UnionFS&#xff09;2.3 容器隔离的核心技术2.3.1 命名空间2.3.2 控制组&#xff08;Cgroups&#xff09;2.3.3 内核…

从零打造企业级Android木马:数据窃取与远程控制实战

简介 木马病毒已从简单的恶意软件演变为复杂的攻击工具,尤其在2025年企业级攻击中,木马病毒正成为黑客组织的主要武器之一。 本文将深入探讨如何制作具备数据窃取和远程控制功能的Android木马,从基础原理到企业级防御绕过技术,同时提供详细的代码实现,帮助开发者理解木马…

ES常识5:主分词器、子字段分词器

文章目录 一、主分词器&#xff1a;最基础的文本处理单元主分词器的作用典型主分词器示例 二、其他类型的分词器&#xff1a;解决主分词器的局限性1. 子字段分词器&#xff08;Multi-fields&#xff09;2. 搜索分词器&#xff08;Search Analyzer&#xff09;3. 自定义分词器&a…

【第三十五周】Janus-pro 技术报告阅读笔记

Janus-Pro 摘要Abstract文章信息引言方法Janus 架构Janus 训练Janus-Pro 的改进 实验结果总结 摘要 本篇博客介绍了Janus-Pro&#xff0c;这是一个突破性的多模态理解与生成统一模型&#xff0c;其核心思想是通过解耦双路径视觉编码架构解决传统方法中语义理解与像素生成的任务…

MySQL 数据操纵与数据库优化

MySQL数据库的DML 一、创建&#xff08;Create&#xff09; 1. 基本语法 INSERT INTO 表名 [(列名1, 列名2, ...)] VALUES (值1, 值2, ...); 省略列名条件&#xff1a;当值的顺序与表结构完全一致时&#xff0c;可省略列名&#xff08;需包含所有字段值&#xff09;批量插…