MySQL 索引与事务详解

news2025/5/13 1:11:47

目录

一、索引(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.coloradmin.cn/o/2374306.html

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

相关文章

基于Qt开发的多线程TCP服务端

目录 一、Qt TCP服务端开发环境准备1. 项目配置2. 核心类说明 二、服务端搭建步骤详解步骤1&#xff1a;初始化服务端对象步骤2&#xff1a;启动端口监听步骤3&#xff1a;处理客户端连接 三、数据通信与状态管理1. 数据收发实现2. 客户端状态监控 四、进阶功能扩展1. 多客户端…

Centos离线安装mysql、redis、nginx等工具缺乏层层依赖的解决方案

Centos离线安装mysql、redis、nginx等工具缺乏层层依赖的解决方案 引困境yum-utils破局 引 前段时间&#xff0c;有个项目有边缘部署的需求&#xff0c;一台没有的外网的Centos系统服务器&#xff0c;需要先安装jdk&#xff0c;node&#xff0c;mysql&#xff0c;reids&#xf…

从零开始开发纯血鸿蒙应用之XML解析

从零开始开发纯血鸿蒙应用 〇、前言一、鸿蒙SDK中的 XML API1、ohos.xml2、ohos.convertxml 三、XML 解析实践1、源数据结构2、定义映射关系3、定义接收对象4、获取文章信息 四、总结 〇、前言 在前后端的数据传输方面&#xff0c;论格式化形式&#xff0c;JSON格式自然是首选…

10.王道_HTTP

1. 互联网时代的诞生 2. HTTP的基本特点 2.1客户端-服务端模型 2.2 无状态协议 2.3 可靠性 2.4 文本协议 3. HTML,CSS和JS 4. HTTP的各个组件 4.1 客户端 4.2 服务端 4.3 代理 5. URI和URL 6. HTTP报文 HTTP报文分为两种——请求报文和响应报文。 6.1 GET请求示例 注意&#…

解决stm32HAL库使用vscode打开,识别不到头文件及uint8_t等问题

解决stm32HAL库使用vscode打开&#xff0c;识别不到头文件及uint8_t等问题 结论&#xff0c;问题有2问题1问题2解决办法将Keil Assistant自动生成的.vscode目录复制到MDK-ARM上层目录将Keil Assistant自动生成的.vscode目录复制到MDK-ARM上层目录将Keil Assistant自动生成的.vs…

uniapp-商城-50-后台 商家信息(输入进行自定义规则验证)

本文介绍了如何在后台管理系统中添加和展示商家信息&#xff0c;包括商家logo、名称、电话、地址和介绍等内容&#xff0c;并支持后期上传营业许可等文件。通过使用uni-app的uni-forms组件&#xff0c;可以方便地实现表单的创建、校验和管理操作。文章详细说明了组件的引入、页…

网页版部署MySQL + Qwen3-0.5B + Flask + Dify 工作流部署指南

1. 安装MySQL和PyMySQL 安装MySQL # 在Ubuntu/Debian上安装 sudo apt update sudo apt install mysql-server sudo mysql_secure_installation# 启动MySQL服务 sudo systemctl start mysql sudo systemctl enable mysql 安装PyMySQL pip install pymysql 使用 apt 安装 My…

WEBSTORM前端 —— 第2章:CSS —— 第8节:网页制作2(小兔鲜儿)

目录 1.项目目录 2.SEO 三大标签 3.Favicon 图标 4.版心 5.快捷导航(shortcut) 6.头部(header) 7.底部(footer) 8.banner 9.banner – 圆点 10.新鲜好物(goods) 11.热门品牌(brand) 12.生鲜(fresh) 13.最新专题(topic) 1.项目目录 【xtx-pc】 ima…

仓储车间安全革命:AI叉车防撞装置系统如何化解操作风险

在现代物流体系中&#xff0c;仓储承担着货物储存、保管、分拣和配送等重要任务。但现代仓储行业的安全现状却不容乐观&#xff0c;诸多痛点严重制约着其发展&#xff0c;其中叉车作业的安全问题尤为突出。相关数据显示&#xff0c;全球范围内&#xff0c;每年因叉车事故导致的…

修改图像分辨率

在这个教程中&#xff0c;您将学习如何使用Python和深度学习技术来调整图像的分辨率。我们将从基础的图像处理技术开始&#xff0c;逐步深入到使用预训练的深度学习模型进行图像超分辨率处理。 一、常规修改方法 1. 安装Pillow库 首先&#xff0c;你需要确保你的Python环境中…

Redis 主从同步与对象模型(四)

目录 1.淘汰策略 1.1 expire/pexpire&#xff08;设置键的过期时间&#xff09; 1.2 配置 1.maxmemory 2.maxmemory-policy 3.maxmemory-samples 2.持久化 2.1背景 2.2 fork 的写时复制机制 2.3 大 key 3.持久化方式 3.1 aof&#xff08;Apped Only File&#xff09…

Linux系列:如何用perf跟踪.NET程序的mmap泄露

一&#xff1a;背景 1. 讲故事 如何跟踪.NET程序的mmap泄露&#xff0c;这个问题困扰了我差不多一年的时间&#xff0c;即使在官方的github库中也找不到切实可行的方案&#xff0c;更多海外大佬只是推荐valgrind这款工具&#xff0c;但这款工具底层原理是利用模拟器&#xff…

如何租用服务器并通过ssh连接远程服务器终端

这里我使用的是智算云扉 没有打广告 但确实很便宜 还有二十小时免费额度 链接如下 注册之后 租用新实例 选择操作系统 选择显卡型号 点击租用 选择计费方式 选择镜像 如果跑深度学习的话 就选项目对应的torch版本 没有的话 就创建纯净的cuda 自己安装 点击创建实例 创建之后 …

华为设备链路聚合实验:网络工程实战指南

链路聚合就像为网络搭建 “并行高速路”&#xff0c;既能扩容带宽&#xff0c;又能保障链路冗余&#xff0c;超实用&#xff01; 一、实验拓扑速览 图中两台交换机 LSW1 和 LSW2&#xff0c;PC1、PC2 归属 VLAN 10&#xff0c;PC3 归属 VLAN 30。LSW1 与 LSW2 通过 GE0/0/1、…

AUTOSAR图解==>AUTOSAR_TR_AIDesignPatternsCatalogue

AUTOSAR 人工智能设计模式目录 AUTOSAR传感器执行器与仲裁设计模式的深入解析与图解 目录 简介传感器和执行器模式 架构概述组件结构交互流程应用场景 多请求者或提供者之间的仲裁模式 架构概述组件结构仲裁流程应用场景 总结 1. 简介 AUTOSAR&#xff08;AUTomotive Open Sy…

双系统电脑中如何把ubuntu装进外接移动固态硬盘

电脑&#xff1a;win11 ubuntu22.04 实体机 虚拟机&#xff1a;VMware17 镜像文件&#xff1a;ubuntu-22.04.4-desktop-amd64.iso 或者 ubuntu20.4的镜像 外接固态硬盘1个 一、首先win11中安装vmware17 具体安装方法&#xff0c;网上很多教程 二、磁盘分区 1.在笔…

【C语言】程序的预处理,#define详解

一、预定义符号 二、#define 1.#define定义标识符 #define &#xff0b; 自定义名称 &#xff0b; 代替的内容 例&#xff1a; #define MAX 100 #define CASE break;case #define CASE break;caseint main() {int n 0;switch (n){case 1:CASE 2:CASE 3:CASE 4:}return …

NVM完全指南:安装、配置与最佳实践

发布于 2025年5月7日 • 阅读时间&#xff1a;10分钟 &#x1f4a1; TL;DR: 本文详细介绍了如何完整卸载旧版Node.js&#xff0c;安装NVM&#xff0c;配置阿里云镜像源&#xff0c;以及设置node_global与node_cache目录&#xff0c;打造高效Node.js开发环境。 &#x1f4cb; 目…

(二)毛子整洁架构(CQRS/Dapper/领域事件处理器/垂直切片)

文章目录 项目地址一、Application 层1.1 定义CQRS的接口以及其他服务1. Command2. IQuery查询3. 当前时间服务接口4. 邮件发送服务接口 1.2 ReserveBooking Command1. 处理传入的参数2. ReserveBookingCommandHandler3. BookingReservedDomainEvent 1.3 Query使用Sql查询1. 创…

如何修改MySQL数据库密码

文章目录 一、忘记数据库密码该如何修改1. 关闭数据库的服务2.跳过安全检查3. 重置密码4.查询用户是否存在5.退出验证密码是否正确 二、未忘记密码该如何修改密码1.直接修改密码2.登录mysql 时间久了&#xff0c;忘记数据库密码了。。。。。 一、忘记数据库密码该如何修改 1. …