MySQL事务基础

1、数据库索引基础

1.1 什么是索引?

数据库索引的原理:

  • 索引是一个排序的列表,存储着值和对应数据的物理地址
  • 就像图书目录一样,通过索引可以快速定位数据,无需扫描整个表
  • 类似C语言链表的指针机制,直接指向数据存储位置

核心概念

  • 作用:加快查询速度,类似书本目录
  • 本质:表中一列或多列值的排序方法
  • 目的:快速定位数据行,提高查询效率
  • 就像图书目录一样,通过索引可以快速定位数据,无需扫描整个表
  • 类似C语言链表的指针机制,直接指向数据存储位置

核心概念

  • 作用:加快查询速度,类似书本目录
  • 本质:表中一列或多列值的排序方法
  • 目的:快速定位数据行,提高查询效率

1.2 索引的作用与效果

生活案例:手机通讯录

当您要在手机通讯录中找"张三"的电话号码:

无索引的情况:

  • 需要从A开始,一个一个名字往下找
  • 如果通讯录有1000个人,可能要找500次

有索引的情况:

  • 按姓名字母排序的通讯录,直接定位到Z开头的"张三"
  • 可能只需要查找20-30

数据库索引的实际效果

  • 小表(<300行):索引效果不明显
  • 大表(>3000行):查询速度提升可达成千上万倍
  • 典型场景:从全表扫描到快速定位

1.3 索引的优缺点分析

优点

  • 大幅提升查询速度
  • 减少数据库IO操作
  • 降低排序成本
  • 保证数据唯一性(唯一索引)
  • 加快表间连接速度 也可以多表查询 建立索引 就是为了加快表之间进行查询(读比写多)

缺点

  • 存储空间占用:索引文件需要额外磁盘空间
    • MyISAM引擎:索引文件和数据文件分离
    • InnoDB引擎:表数据文件本身就是索引文件
  • 写入性能影响:插入、修改、删除数据时,索引也需要更新

2、索引创建原则与策略

2.1 什么时候应该创建索引?

必须创建索引的场景

1.主键和外键

  • 主键:唯一性标识,自动创建索引
  • 外键:关联查询,快速定位两张表学生学习表信息表

2. 大表(>300行)

  • 超过300行的表建议创建索引
  • 小表索引效果不明显,反而影响写入性能

3. 频繁查询的字段

  • 经常出现在WHERE子句中的字段
  • 用户名、手机号、邮箱等常用查询字段

4. 连接字段

  • 经常用于表连接的字段订单表下单表
  • 如用户表和订单表的user_id

不适合创建索引的场景

1. 唯一性很差的字段

  • 如性别字段(只有"男"、"女"两个值)
  • 状态字段(如"启用"、"禁用")

2. 更新频繁的字段

  • 如最后登录时间字段
  • 在线状态字段

3. 大文本字段

  • BLOB、CLOB类型字段
  • 文章内容、长文本描述

2.2 索引选择原则

索引优化原则

  • 选择性强:字段值的重复度低
  • 查询频繁:经常用于WHERE条件
  • 数据量适中:不能太小(效果不明显),不能太大(占用空间过多)
  • 小字段优先:整型比字符串更高效

3、索引类型详解

3.1 普通索引(INDEX)

**用途:**最基础的索引类型,没有唯一性限制

3.1.1 直接创建索引

CREATE INDEX 索引名 ON 表名 (列名[(length)]);

#(列名(length)):length是可选项。如果忽略 length 的值,则使用整个列的值作为索引。如果指定使 用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。

#索引名建议以"_index"结尾。

3.1.2 修改表方式创建

ALTER TABLE 表名 ADD INDEX 索引名 (列名);

3.1.3 创建表的时候指定索引

CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));

3.2 唯一索引(UNIQUE)

用途: 与普通索引类似,但区别是唯一索引列的每个值都唯一 。唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。

3.2.1 直接创建唯一索引

CREATE UNIQUE INDEX 索引名ON表名(列名);

3.2.2 修改表方式创建

ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);

3.2.3 创建表的时候指定

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

3.3 主键索引(PRIMARY KEY)

特点:

  • 一个表只能有一个主键
  • 不允许空值
  • 自动创建唯一索引
  • 性能最优的索引类型
3.3.1 创建表的时候指定

CREATETABLE表名 ([...],PRIMARY KEY (列名));

3.3.2 修改表方式创建

ALTER TABLE 表名 ADD PRIMARY KEY (列名);

3.4 组合索引(复合索引)

最左前缀原则:

组合索引(复合索引)是基于多个字段 创建的索引(如 INDEX idx_abc (a, b, c)),而「最左前缀原则」是组合索引生效的核心规则:MySQL 在匹配索引时,会从索引的最左侧字段开始,依次匹配连续的字段;如果跳过左侧字段直接匹配右侧字段,索引会失效

CREATETABLE表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2, 列名3));

3.5 全文索引(FULLTEXT)

3.5.1 直接创建索引

CREATE FULLTEXT INDEX 索引名ON表名 (列名);

3.5.2 修改表方式创建

ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

3.5.3 创建表的时候指定索引

CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));

3.5.4 使用全文索引查询

SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

注意事项:

  • MySQL 5.6+支持InnoDB引擎
  • 适用于CHAR、VARCHAR、TEXT类型文本
  • 每个表只能有一个全文索引

4、索引的查看与维护

4.1 查看索引信息

命令格式

索引信息字段说明

|--------------|---------------|----------|
| 字段名 | 含义 | 示例 |
| Table | 表名 | users |
| Key_name | 索引名 | idx_name |
| Column_name | 索引列名 | name |
| Seq_in_index | 列在索引中的顺序 | 1 |
| Non_unique | 是否唯一(0=是,1=否) | 1 |
| Null | 是否允许NULL | YES |
| Index_type | 索引类型 | BTREE |

4.2 删除索引

一致性的含义:

  • 事务前后数据总量保持不变
  • 数据库的完整性约束不被破坏
  • 数据从一个一致状态转换到另一个一致状态
5.2.3I - 隔离性(Isolation)

隔离性的含义:

  • 并发执行的事务相互隔离
  • 每个事务有独立的数据空间
  • 避免脏读、不可重复读、幻读等问题
5.2.4 D - 持久性(Durability)

持久性的含义:

  • 事务一旦提交,对数据库的改变是永久的 即
  • 使系统故障也不会丢失
  • 通过日志机制保证数据的持久性

5.3 事务控制语句扩展

  • BEGIN 或 START TRANSACTION:显式地开启一个事务。
  • COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。 ROLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
  • SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个SAVEPOINT;"S1"代表回滚点名称。
  • ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。

如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。

当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。 如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。

当然无论开启与否,begin; commit|rollback; 都是独立的事务

6、总结

事务关键的一点:一致性,要么都成功,要么都失败,保存在自己的回滚日志中 对于事务过程中,我们可以对每一步sql进行savepoint打标机,为了方便回顾 提交事务:commit rollback

相关推荐
l1t2 小时前
三种用SQL解决Advent of Code 2022第8题 树顶木屋 的比较和分析
数据库·sql·oracle·duckdb·advent of code
如果未来,2 小时前
Oracle的Redo log和Undo log的区别
数据库·oracle
koping_wu2 小时前
【方案设计】Mysql相关场景
数据库·mysql
杨云龙UP2 小时前
SQL Server小技巧:用 SSMS 重置登录密码,不影响正在运行的系统
运维·服务器·数据库·sql·sqlserver
洁洁!2 小时前
openEuler多样性算力支持实践:容器化多架构应用部署与调度
服务器·数据库·科技·语言模型·数据分析
白露与泡影2 小时前
MySQL整体设计与存储引擎深度剖析:从架构哲学到引擎选型(了解)
数据库·mysql·架构
ManageEngine卓豪2 小时前
企业网站监控与性能优化指南
数据库·microsoft·性能优化
小小哭包2 小时前
Spring+MyBatis实现数据库读写分离方案
数据库·spring·mybatis
Shingmc33 小时前
MySQL表的操作
数据库·mysql