Mysql数据库 索引,事务
Mysql数据库 索引,事务
一.索引
简介
索引是数据库中用于提高查询效率的一种数据结构,它通过预先排序和存储特定列的值,帮助数据库快速定位符合条件的数据行,避免全表扫描。以下是关于索引的核心简介:
1. 核心作用
- 加速查询:通过索引直接定位数据,减少 IO 和 CPU 开销。
- 强制约束:如主键索引和唯一索引确保数据的唯一性。
- 优化排序:避免
ORDER BY
和GROUP BY
时的额外排序操作。
2. 工作原理
-
类似书籍目录:索引存储了列值与数据行位置的映射关系,查询时直接通过索引定位数据,无需逐行扫描。
-
常见数据结构
:
- B-Tree/B+Tree:最常用的索引结构,支持范围查询和有序访问(MySQL 默认)。
- 哈希索引:基于哈希表,仅支持精确匹配(如 Memory 引擎)。
- 全文索引:专门用于文本搜索,支持关键词匹配。
3. 常见类型
类型 | 特点 | 适用场景 |
---|---|---|
普通索引 | 加速查询,无特殊限制 | 经常用于WHERE 条件的列 |
唯一索引 | 列值唯一(允许 NULL) | 邮箱、身份证等唯一性字段 |
主键索引 | 特殊的唯一索引,不允许 NULL | 唯一标识表中每行数据 |
复合索引 | 多列组合,遵循最左前缀原则 | 多条件查询(如WHERE a=1 AND b=2 ) |
全文索引 | 支持文本搜索(MATCH AGAINST ) | 文章、评论等大文本字段 |
空间索引 | 优化地理空间数据查询 | 地图位置查询(如附近的店铺) |
4. 使用场景
- 高频查询条件:为
WHERE
、JOIN
、ORDER BY
中的列创建索引。 - 唯一性约束:通过唯一索引或主键保证数据不重复。
- 大表优化:数据量超过数万行时,索引效果显著。
5. 注意事项
- 双刃剑:索引会提升查询速度,但增加写操作(INSERT/UPDATE/DELETE)的开销,并占用额外存储空间。
- 最左前缀原则:复合索引必须从最左侧列开始使用(如索引
(a,b,c)
支持WHERE a=1
,但不支持WHERE b=1
)。 - 避免过度索引:冗余索引会降低性能,需定期清理。
示例
直接创建普通索引
create index 索引名 on 表名(列名)
mysql> create index id_index on users(id);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> show index from users \G ####查看索引
*************************** 1. row ***************************Table: usersNon_unique: 1Key_name: id_index ###索引名Seq_in_index: 1Column_name: idCollation: ACardinality: 3Sub_part: NULLPacked: NULLNull: YESIndex_type: BTREEComment:
Index_comment: Visible: YESExpression: NULL
1 row in set (0.00 sec)
使用第二种方式创建索引
alter table 表名 add index 索引名 (列名)
mysql> alter table users add index name_index (name) \G
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> show index from users\G
*************************** 1. row ***************************Table: usersNon_unique: 1Key_name: name_indexSeq_in_index: 1Column_name: nameCollation: ACardinality: 3Sub_part: NULLPacked: NULLNull: YESIndex_type: BTREEComment:
Index_comment: Visible: YESExpression: NULL
1 row in set (0.01 sec)
使用第三种方式创建索引
mysql> create table users (id int(10),name char(20),age int(10) ,index id_index (id));
Query OK, 0 rows affected, 2 warnings (0.02 sec)mysql> create table users (id int(10),name char(20),age int(10) ,index id_index (id));
Query OK, 0 rows affected, 2 warnings (0.02 sec)mysql> desc users; ###该命令也可以看到那个是索引
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int | YES | MUL | NULL | |
| name | char(20) | YES | | NULL | |
| age | int | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)
删除普通索引唯一索引
drop index 索引名 on 表名
mysql> drop index id_index on users;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> show index from users;
Empty set (0.00 sec)
创建主键索引
这个方式跟上面创建普通方式索引方式一样都有3种
mysql> alter table users add primary key (id) \G ###修改users表中的id为primary key
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> show index from users \G ####查看来自users表的索引
*************************** 1. row ***************************Table: usersNon_unique: 0Key_name: PRIMARYSeq_in_index: 1Column_name: idCollation: ACardinality: 0Sub_part: NULLPacked: NULLNull: Index_type: BTREEComment:
Index_comment: Visible: YESExpression: NULL
1 row in set (0.00 sec)
创建索引原则
高频查询条件列
- 为经常出现在
WHERE
、JOIN
、ORDER BY
和GROUP BY
子句中的列创建索引。
选择性高的列
- 索引列的值越唯一(选择性高),索引效率越高。
- 避免对低选择性列(如性别、状态码)创建索引,除非表数据量极大。
总结
索引是数据库性能优化的重要手段,但需根据业务需求和查询模式合理设计。通过分析查询语句和数据特征,针对性地创建索引,可显著提升数据库响应速度。
引类型 | 创建语法示例 |
---|---|
普通索引 | CREATE INDEX idx_col ON table (column); |
唯一索引 | CREATE UNIQUE INDEX uniq_col ON table (column); |
主键索引 | CREATE TABLE t (id INT PRIMARY KEY); 或 ALTER TABLE t ADD PRIMARY KEY; |
复合索引 | CREATE INDEX idx_col1_col2 ON table (col1, col2); |
全文索引 | CREATE FULLTEXT INDEX ft_text ON table (text_col); |
空间索引 | CREATE SPATIAL INDEX sp_geo ON table (geo_col); |
二.事务
MySQL 的事务(Transaction)是数据库操作的基本单元,用于保证一组数据库操作要么全部成功执行,要么全部失败回滚,确保数据的一致性和完整性。以下从概念、核心特性、实现机制、使用方法等方面全面解析 MySQL 事务:
一、事务的核心概念与 ACID 特性
1. 事务的定义
事务是一组不可分割的数据库操作集合,例如转账场景中:
- 从账户 A 扣款(操作 1)
- 向账户 B 存款(操作 2)
这两个操作必须作为一个整体执行,要么都成功,要么都失败。
2. ACID 特性(事务的四大核心属性)
- 原子性(Atomicity):事务中的操作要么全部完成,要么全部回滚,不会停留在中间状态。
- 一致性(Consistency):事务执行前后,数据库从一个合法状态转换到另一个合法状态(如转账前后总金额不变)。
- 隔离性(Isolation):多个事务并发执行时,相互之间不受干扰,如同单线程执行。
- 持久性(Durability):事务提交后,数据变更会永久保存,即使数据库崩溃也不会丢失。
二、MySQL 事务的实现基础
1. 存储引擎支持
- InnoDB:MySQL 默认支持事务的存储引擎,完全满足 ACID 特性。
- MyISAM:不支持事务,适合只读或简单查询场景。
2. 事务日志(关键实现机制)
- Redo Log(重做日志):记录事务对数据的修改,用于崩溃恢复时保证持久性。
- Undo Log(回滚日志):记录事务修改前的数据,用于回滚操作和实现 MVCC(多版本并发控制)。
3. 并发控制:锁与 MVCC
- 锁机制:通过行锁、表锁等避免并发事务冲突(InnoDB 默认使用行锁)。
- MVCC(Multi-Version Concurrency Control):为每行数据维护多个版本,使读操作无需加锁,提升并发性能(主要用于 RC 和 RR 隔离级别)。
三、事务的隔离级别(Isolation Levels)
事务隔离级别决定了并发事务之间的干扰程度,MySQL 支持 4 种隔离级别(从低到高):
隔离级别 | 脏读 | 不可重复读 | 幻读 | MySQL 默认 |
---|---|---|---|---|
Read Uncommitted(读未提交) | 允许 | 允许 | 允许 | 否 |
Read Committed(读已提交) | 禁止 | 允许 | 允许 | 否 |
Repeatable Read(可重复读) | 禁止 | 禁止 | 允许 | 是(InnoDB) |
Serializable(可串行化) | 禁止 | 禁止 | 禁止 | 否 |
典型问题说明:
- 脏读:事务 A 读取到事务 B 未提交的数据,若 B 回滚,A 读到的数据是无效的。
- 不可重复读:事务 A 多次读取同一数据时,事务 B 修改并提交了该数据,导致 A 前后读取结果不一致。
- 幻读:事务 A 读取符合条件的记录后,事务 B 插入新记录,A 再次查询时发现多了新数据(类似 “幻觉”)。
设置隔离级别(需在事务启动前执行):
-- 查看当前隔离级别
SELECT @@TRANSACTION_ISOLATION;-- 设置全局隔离级别(重启MySQL后失效)
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 设置当前会话隔离级别(仅对当前连接有效)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
四、事务的操作语法
1. 手动控制事务(推荐方式)
-- 启动事务
START TRANSACTION; -- 或 BEGIN-- 执行数据库操作
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;-- 检查是否有错误,若无则提交
COMMIT;-- 若发生错误,回滚到事务开始前的状态
ROLLBACK;
2. 自动提交(默认模式)
MySQL 默认开启自动提交(AUTOCOMMIT=1
),每条 SQL 语句作为独立事务执行:
-- 查看自动提交状态
SELECT @@AUTOCOMMIT; -- 1表示开启,0表示关闭-- 临时关闭自动提交(当前会话)
SET AUTOCOMMIT = 0;-- 执行多个操作作为一个事务
UPDATE ...;
UPDATE ...;
COMMIT; -- 手动提交-- 恢复自动提交
SET AUTOCOMMIT = 1;
3. 保存点(Savepoint)
用于回滚部分事务操作:
START TRANSACTION;UPDATE table1 SET ...;
SAVEPOINT sp1; -- 设置保存点UPDATE table2 SET ...;
ROLLBACK TO sp1; -- 回滚到sp1,保留table1的修改
COMMIT;
五、事务的应用场景
- 金融交易:转账、支付等场景,确保资金变动的一致性。
- 订单系统:下单时同时扣减库存、生成订单记录,避免库存超卖。
- 数据批量操作:批量插入、更新时,失败则回滚,避免脏数据。
- 跨表操作:多表关联更新时,保证数据关联关系的正确性。
六、事务最佳实践
-
保持事务简短:避免长事务占用锁资源,影响并发性能。
-
先查询后操作:减少事务内的查询操作,降低锁持有时间。
-
合理选择隔离级别
:
- 读多写少场景:使用
Repeatable Read
(MySQL 默认)。 - 高并发写场景:考虑
Read Committed
,并配合乐观锁。
- 读多写少场景:使用
-
错误处理:确保事务中发生异常时能正确回滚(如程序中捕获异常并执行
ROLLBACK
)。 -
避免大事务:对批量数据操作,采用分批提交(如每 1000 条提交一次)。
七、事务与锁的关系
- 事务通过锁实现隔离性,但不同隔离级别下锁的行为不同:
Serializable
:对所有读取的行加锁,完全串行化执行,性能最差。Repeatable Read
(InnoDB 默认):通过 MVCC 和间隙锁(Next-Key Lock)防止幻读,性能较好。
- 锁超时与死锁:
- 长时间等待锁会触发
Lock wait timeout
错误,需调整innodb_lock_wait_timeout
参数。 - 死锁时 MySQL 会自动回滚其中一个事务,应用层需做好重试逻辑。
- 长时间等待锁会触发
总结
MySQL 事务是保证数据一致性的核心机制,通过 ACID 特性和隔离级别确保并发操作的正确性。在实际开发中,需根据业务场景选择合适的隔离级别,合理控制事务范围,并做好错误处理,以平衡性能与数据可靠性。
相关文章:
Mysql数据库 索引,事务
Mysql数据库 索引,事务 一.索引 简介 索引是数据库中用于提高查询效率的一种数据结构,它通过预先排序和存储特定列的值,帮助数据库快速定位符合条件的数据行,避免全表扫描。以下是关于索引的核心简介: 1. 核心作用…...

RESTful APInahamcon Fuzzies-write-up
RESTful API 路径详解 RESTful API(Representational State Transfer)是一种 基于 HTTP 协议的 API 设计风格,它通过 URL 路径 和 HTTP 方法(GET、POST、PUT、DELETE 等)来定义资源的访问方式。它的核心思想是 将数据…...
安装DockerDocker-Compose
Docker 1、换掉关键文件 vim /etc/yum.repos.d/CentOS-Base.repo ▽ [base] nameCentOS-$releasever - Base - Mirrors Aliyun baseurlhttp://mirrors.aliyun.com/centos/$releasever/os/$basearch/ gpgcheck1 enabled1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG-KEY-C…...

2025年机械化设计制造与计算机工程国际会议(MDMCE 2025)
2025年机械化设计制造与计算机工程国际会议(MDMCE 2025) 2025 International Conference on Mechanized Design, Manufacturing, and Computer Engineering 一、大会信息 会议简称:MDMCE 2025 大会地点:中国贵阳 审稿通知&#…...
Java生态中的NLP框架
Java生态系统中提供了多个强大的自然语言处理(NLP)框架,以下是主要的NLP框架及其详细说明: 1、Apache OpenNLP 简介:Apache OpenNLP是Apache软件基金会的开源项目,提供了一系列常用的NLP工具。 主要功能: …...
NVM,Node.Js 管理工具
node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors/npm/ 一、什么是 NVM? NVM 是一个命令行工具,允许你在同一台机器上安装、切换和管理多个 Node.js 版本,解决项目间版本冲突问题。 二、安装 …...

Jmeter逻辑控制器、定时器
目录 一、Jmeter逻辑控制器 ①IF(如果)控制器 作用: 位置: 参数介绍: 步骤: ②循环控制器 作用: 位置: 步骤: 线程组属性VS循环控制器 ③ForEach控制器 作用: 位置&am…...
每日八股文6.2
每日八股-6.2 Go1.GMP调度原理(这部分多去看看golang三关加深理解)2.GC(同样多去看看golang三关加深理解)3.闭包4.go语言函数是一等公民是什么意思5.sync.Mutex和sync.RWMutex6.sync.WaitGroup7.sync.Cond8.sync.Pool9.panic和rec…...

R3GAN利用配置好的Pytorch训练自己的数据集
简介 简介:这篇论文挑战了"GANs难以训练"的广泛观点,通过提出一个更稳定的损失函数和现代化的网络架构,构建了一个简洁而高效的GAN基线模型R3GAN。作者证明了通过合适的理论基础和架构设计,GANs可以稳定训练并达到优异性能。 论文题目:The GAN is dead; long l…...

吴恩达机器学习笔记(1)—引言
目录 一、欢迎 二、机器学习是什么 三、监督学习 四、无监督学习 一、欢迎 机器学习是当前信息技术领域中最令人兴奋的方向之一。在这门课程中,你不仅会学习机器学习的前沿知识,还将亲手实现相关算法,从而深入理解其内部机理。 事实上&…...
信贷风控规则策略累计增益lift测算
在大数据风控业务实践过程中,目前业内主要还是采用规则叠加的办法做策略,但是会遇到一些问题: 1.我们有10条规则,我上了前7条后,后面3条的绝对风险增益是多少? 2.我的规则之间应该做排序吗,最重…...

【笔记】Windows 部署 Suna 开源项目完整流程记录
#工作记录 因篇幅有限,所有涉及处理步骤的详细处理办法请参考文末资料。 Microsoft Windows [Version 10.0.27868.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗…...

【Elasticsearch】Elasticsearch 核心技术(一):索引
Elasticsearch 核心技术(一):索引 1.索引的定义2.索引的命名规范3.索引的增、删、改、查3.1 创建索引3.1.1 创建空索引 3.2 删除索引3.3 文档操作3.3.1 添加/更新文档(指定ID)3.3.2 添加文档(自动生成ID&am…...
AudioTrack的理解
采样率说的是一秒钟采样多少点 波形频率说的是一个采样周期内有多少个波形 pcm编码说的是 16 还是8 直接决定write的时候使用short还是byte 一、初始化配置 参数设定 需定义音频格式、采样率及缓冲区大小,确保符合硬件支持范围 // 音频参数配置 int sample…...
HTTP请求与HTTP响应介绍及其字段
HTTP请求 请求行:请求行主要包含请求方法、请求URI(统一资源标识符)和HTTP协议版本。例如: GET /index.html HTTP/1.1 请求头(Headers):包含客户端的元数据,为服务器提供了额外信息…...

Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理
Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理 面试周期就是要根据JD调整准备内容(挠头),最近会混合复习针对全栈这块的内容,目前是根据受伤的JD,优先选择一些基础的操作系统、Java、Nod…...

中科院报道铁电液晶:从实验室突破到多场景应用展望
2020年的时候,相信很多关注科技前沿的朋友都注意到,中国科学院一篇报道聚焦一项有望改写显示产业格局的新技术 —— 铁电液晶(FeLC)。这项被业内称为 "下一代显示核心材料" 的研究,究竟取得了哪些实质性进展…...

智慧政务标准规范介绍:构建高效、协同的政务信息体系
在当今信息化快速发展的时代,智慧政务作为政府数字化转型的重要方向,正逐步改变着政府管理和服务的方式。为了确保智慧政务系统的建设能够有序、高效地进行,国家制定了一系列标准规范,其中GB∕T 21062系列标准《政务信息资源交换体…...
6个月Python学习计划 Day 12 - 字符串处理 文件路径操作
第一周 Day 1 - Python 基础入门 & 开发环境搭建 Day 2 - 条件判断、用户输入、格式化输出 Day 3 - 循环语句 range 函数 Day 4 - 列表 & 元组基础 Day 5 - 字典(dict)与集合(set) Day 6 - 综合实战:学生信息…...
CSS篇-3
1. CSS 中哪些样式可以继承?哪些不可以继承? 可继承的样式: 与字体相关的样式,如:font-size、font-family、color 列表样式:list-style(如 UL、OL 的 list-style-type) 不可继承的样式: 与布局和尺寸相关的样式,如:border、padding、margin、width、height 总结: …...
Unity使用Lua框架和C#框架开发游戏的区别
在Unity中使用Lua框架和C#框架开发游戏有显著的区别,主要体现在性能、开发效率、热更新能力、维护成本等方面。 1. 语言类型与设计目标 维度LuaC#类型动态类型、解释型脚本语言静态类型、编译型面向对象语言设计初衷轻量级嵌入、配置和扩展宿主程序通用开发&#…...
Go开发简历优化指南
一、简历格式与排版 (一)简洁至上 去除多余装饰:在 Go 后台开发简历中,应摒弃那些花哨却无实际作用的元素,比如复杂的封面、页眉、页脚等。设想招聘人员每日要处理大量简历,若你的简历有繁杂的封面设计&a…...

手机照片太多了存哪里?
手机相册里塞满了旅行照片、生活碎片,每次清理都舍不得删?NAS——一款超实用的存储方案,让你的回忆安全又有序~ 1️⃣自动备份解放双手 手机 / 电脑 / 相机照片全自动同步到 NAS,再也不用手动传文件 2️⃣远程访问像…...
【论文笔记】SecAlign: Defending Against Prompt Injection with Preference Optimization
论文信息 论文标题:SecAlign: Defending Against Prompt Injection with Preference Optimization - CCS 25 论文作者: Sizhe Chen - UC Berkeley ;Meta, FAIR 论文链接:https://arxiv.org/abs/2410.05451 代码链接:h…...
IP Search Performance Tests dat/db/xdb/mmdb 结构性能差异对比
IP Search Performance Tests qqzeng-ip by 2025-06-01 测试环境: BenchmarkDotNet v0.15.0 macOS Sequoia 15.5 (24F74) [Darwin 24.5.0] Apple M4 Max, 1 CPU, 14 logical and 14 physical cores .NET SDK 10.0.100-preview.4.25258.110 [Host]: .NET…...

OpenRouter使用指南
OpenRouter 是一个专注于大模型(LLM)API 聚合和路由的服务平台,旨在帮助开发者便捷地访问多种主流大语言模型(如 GPT-4、Claude、Llama 等),并提供统一的接口、成本优化和智能路由功能。以下是它的核心功能…...
Linux 中 m、mm、mmm 函数和 make 的区别
在 Linux 内核开发和 Android 开发中,构建系统通常使用 make 命令来编译和构建项目。而在 Android 开发环境中,还有 m、mm 和 mmm 等命令,这些命令是 Android 构建系统的一部分,提供了更高效和便捷的构建方式。以下将详细介绍这些…...
【MAC】YOLOv8/11/12 转换为 CoreML 格式并实现实时目标检测
在本文中,我们将详细介绍如何将 YOLOv8/11/12 模型转换为 CoreML 格式,并使用该模型在摄像头实时检测中进行目标检测。主要适用于M1、M2、M3、M4芯片的产品。 以下教程在YOLOv8/11/12均适用,此处就以 YOLOv11 举例 目录 前提条件YOLOv8/11/12 转换为 CoreML实时目标检测结论…...
NodeJS全栈WEB3面试题——P7工具链 测试
📊 7.1 Truffle vs Hardhat:各自的优势? 项目TruffleHardhat📦 成熟度老牌框架,社区大,文档全面新一代框架,现代化设计🧪 测试支持内置 Mocha 测试框架支持 Mocha Chai,…...
Mybatis框架各配置文件主要内容详解(二)
ResultMap解决了数据库字段与实体类之间不一致导致的问题 <!--resultMap:设置自定义映射属性:id:表示自定义映射的唯一标识type:查询的数据要映射的实体类的类型子标签:id:设置主键的映射关系result&…...