MySQL 索引与事务核心知识点

一、MySQL 索引

1. 索引基础认知

索引是数据库中排好序的索引值 + 数据行物理地址的列表,作用类似图书目录,能通过二分查找快速定位数据,避免全表扫描,大幅提升查询效率;但索引会占用额外磁盘空间,且增删改操作会因维护索引变慢,需按需创建。

补充知识点

  • MySQL 默认索引结构是 B + 树,查询效率极高。
  • 索引会加快查询 ,但会减慢增删改
  • 小表、重复值多的字段不适合建索引。

2. 索引的分类

(1)物理分类:聚簇索引 & 非聚簇索引
  • 聚簇索引:按数据物理存储位置排序,多行检索速度快(InnoDB 主键默认是聚簇索引)
  • 非聚簇索引:索引与数据物理存储分离,单行检索速度快(MyISAM 默认非聚簇索引)

补充知识点

  • 一张表只能有一个聚簇索引(主键)。
  • 非聚簇索引需要回表查询,效率略低。
(2)逻辑分类(核心常用)

表格

索引类型 核心特点 适用场景
普通索引 无任何限制,最基础 WHERE/JOIN 中频繁出现的字段
唯一索引 索引列值唯一,允许空值 需字段唯一但可空的场景
主键索引 特殊唯一索引,一个表仅一个,不允许空值 表的唯一标识
组合索引 多个字段组成,遵循最左前缀原则 多条件联合查询
全文索引 针对文本内容检索 大文本模糊查询

3. 索引的创建(标准格式 + 代码)

(1)普通索引

标准命令格式

mysql

复制代码
CREATE INDEX 索引名 ON 表名(字段名);
ALTER TABLE 表名 ADD INDEX 索引名(字段名);

代码

mysql

复制代码
-- 直接创建
CREATE INDEX index_name ON table_name(column(length));
-- 修改表结构创建
ALTER TABLE table_name ADD INDEX index_name (column(length));
-- 建表时创建
CREATE TABLE `table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(255) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX index_name (title(50))
);

补充知识点

  • 普通索引无约束,只用于加速查询。
  • 前缀索引只索引前 N 个字符,节省空间。
(2)唯一索引

标准命令格式

mysql

复制代码
CREATE UNIQUE INDEX 索引名 ON 表名(字段名);
ALTER TABLE 表名 ADD UNIQUE INDEX 索引名(字段名);

代码

mysql

复制代码
-- 直接创建
CREATE UNIQUE INDEX index_name ON table_name(column(length));
-- 修改表结构创建
ALTER TABLE table_name ADD UNIQUE index_name (column(length));
-- 建表时创建
CREATE TABLE `table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE indexName (title(50))
);

补充知识点

  • 唯一索引值不可重复,但允许 NULL。
  • 一个表可以创建多个唯一索引。
(3)主键索引

标准命令格式

mysql

复制代码
CREATE TABLE 表名(
  字段名 类型 PRIMARY KEY AUTO_INCREMENT
);

代码

mysql

复制代码
CREATE TABLE `table_name` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(255) NOT NULL,
  PRIMARY KEY (`id`)
);

补充知识点

  • 主键索引不能为空、不能重复
  • 一张表只能有一个主键
(4)组合索引

标准命令格式

mysql

复制代码
CREATE INDEX 索引名 ON 表名(字段1,字段2,字段3);

代码

mysql

复制代码
CREATE TABLE user(
  `name` varchar(9),
  `age` int(3),
  `sex` tinyint(1),
  INDEX user_index(name, age, sex)
);
-- 有效查询
SELECT * FROM user WHERE name = '张三' AND age = 20 AND sex = 1;
-- 无效查询
SELECT * FROM user WHERE age = 20 AND sex = 1;

补充知识点

  • 组合索引遵循最左前缀原则,必须从第一个字段开始匹配。
  • 建一个组合索引 ≈ 建多个单列索引。
(5)全文索引

标准命令格式

mysql

复制代码
ALTER TABLE 表名 ADD FULLTEXT INDEX 索引名(字段名);
CREATE FULLTEXT INDEX 索引名 ON 表名(字段名);

代码

mysql

复制代码
CREATE TABLE `table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(255) NOT NULL,
  `content` text NULL,
  PRIMARY KEY (`id`),
  FULLTEXT (content)
);
ALTER TABLE article ADD FULLTEXT index_content(content);
CREATE FULLTEXT INDEX index_content ON article(content);

补充知识点

  • 全文索引比 LIKE 快很多,专门用于文本搜索。
  • 只支持 CHAR、VARCHAR、TEXT 类型。

4. 索引的查看与删除

(1)查看索引

标准命令格式

mysql

复制代码
SHOW INDEX FROM 表名;

代码

mysql

复制代码
SHOW INDEX FROM tablename;
SHOW KEYS FROM tablename;
SHOW INDEX FROM renyuan\G;
(2)删除索引

标准命令格式

mysql

复制代码
DROP INDEX 索引名 ON 表名;
ALTER TABLE 表名 DROP INDEX 索引名;

代码

mysql

复制代码
ALTER TABLE 表名 DROP INDEX 索引名;
DROP INDEX 索引名 ON 表名;

5. 创建索引的核心原则

  1. 查多增删改少的表适合建索引,小表无需建索引
  2. WHERE、JOIN、GROUP BY、ORDER BY 字段优先建索引
  3. 低基数字段(性别、状态)不建索引
  4. 大字段用前缀索引
  5. 组合索引严格遵循最左前缀原则

二、MySQL 事务

1. 事务基础认知

事务是一组不可分割的操作,要么全部成功,要么全部回滚,保证数据安全。

  • 只有 InnoDB 支持事务
  • 只管理 INSERT/UPDATE/DELETE

补充知识点

  • 事务用于保证数据一致性,如转账、订单、支付。
  • 事务失败会自动回滚,不会产生脏数据。

2. 事务的 ACID 四大特性

  • 原子性:不可分割,全成功或全失败
  • 一致性:数据前后规则不变
  • 隔离性:并发事务互不干扰
  • 持久性:提交后永久生效

补充知识点

  • ACID 是事务的核心标准
  • 原子性保证操作安全,一致性保证数据不乱。

3. 事务的隔离级别

InnoDB 默认:可重复读(REPEATABLE READ)

  1. 读未提交:脏读
  2. 读提交:不可重复读
  3. 可重复读:幻读
  4. 串行化:无问题,但性能低

补充知识点

  • 脏读:读到未提交的数据
  • 不可重复读:同一事务两次查询结果不同
  • 幻读:查询时突然多 / 少了数据

4. 事务控制语句(格式 + 代码)

标准命令格式

mysql

复制代码
BEGIN;            -- 开启事务
COMMIT;           -- 提交
ROLLBACK;         -- 回滚
SAVEPOINT 名称;    -- 保存点
SET AUTOCOMMIT=0; -- 关闭自动提交

代码

mysql

复制代码
BEGIN;
COMMIT;
ROLLBACK;
SAVEPOINT sp1;
ROLLBACK TO sp1;
RELEASE SAVEPOINT sp1;
SET AUTOCOMMIT=0;
SET AUTOCOMMIT=1;

补充知识点

  • MySQL 默认自动提交,执行 SQL 立即生效。
  • 手动事务必须手动 COMMIT 才会保存。
事务实操示例

mysql

复制代码
CREATE DATABASE IF NOT EXISTS kgc;
USE kgc;

CREATE TABLE test( id int(5)) engine=innodb;

BEGIN;
INSERT INTO test VALUE(1);
INSERT INTO test VALUE(2);
COMMIT;

BEGIN;
INSERT INTO test VALUES(3);
ROLLBACK;

三、补充:库 & 表操作(格式 + 知识点)

1. 数据库操作

标准格式

mysql

复制代码
CREATE DATABASE 库名;
USE 库名;
DROP DATABASE 库名;
SHOW DATABASES;

代码

mysql

复制代码
CREATE DATABASE IF NOT EXISTS test;
USE test;

补充知识点

  • 必须 USE 库名,否则无法操作表。
  • IF NOT EXISTS 防止重复创建报错。

2. 数据表操作

标准格式

mysql

复制代码
CREATE TABLE 表名(字段 类型 约束) ENGINE=InnoDB;
DESC 表名;
SHOW TABLES;

代码

mysql

复制代码
CREATE TABLE user(
    id INT PRIMARY KEY AUTO_INCREMENT
) ENGINE=InnoDB;

DESC user;

补充知识点

  • 必须用 InnoDB 才能用事务和索引。
  • DESC 表名:快速查看表结构。

四、最终总结

  1. 索引 = 查询加速,有固定创建 / 删除格式
  2. 事务 = 数据安全,要么全成要么全滚
  3. 操作表前必须 USE 库名
  4. 表引擎必须是 InnoDB
  5. 索引和事务要按需使用,平衡性能与安全
相关推荐
qq_416018722 小时前
使用Scikit-learn进行机器学习模型评估
jvm·数据库·python
m0_587958952 小时前
Python字典与集合:高效数据管理的艺术
jvm·数据库·python
小程故事多_802 小时前
Claude Code实战指南,OpenSpec与Superpowers协同开发,让后端开发更规范、更高效
数据库·人工智能·架构·aigc·ai编程
SelectDB技术团队3 小时前
从两套系统到一条 SQL:SelectDB search() 搞定日志的搜索与分析
数据库·数据仓库·sql·开源
2301_776508723 小时前
用Python制作一个文字冒险游戏
jvm·数据库·python
2501_945424803 小时前
Python面向对象编程(OOP)终极指南
jvm·数据库·python
2401_873544923 小时前
Python在金融科技(FinTech)中的应用
jvm·数据库·python
草莓熊Lotso3 小时前
Linux 进程信号深度解析(上):信号的产生与本质(含完整案例)
android·linux·运维·服务器·数据库·c++·mysql