MySQL 索引与事务核心知识点全解

 更新时间:2026年03月26日 16:43:49   作者:炸炸鱼.  
这篇文章给大家介绍MySQL 索引与事务核心知识,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

一、MySQL 索引

1. 索引基础认知

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

补充知识点

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

2. 索引的分类

(1)物理分类:聚簇索引 & 非聚簇索引

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

补充知识点

  • 一张表只能有一个聚簇索引(主键)。
  • 非聚簇索引需要回表查询,效率略低。

(2)逻辑分类(核心常用)

表格

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

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

(1)普通索引

标准命令格式

CREATE INDEX 索引名 ON 表名(字段名);
ALTER TABLE 表名 ADD INDEX 索引名(字段名);

代码

-- 直接创建
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)唯一索引

标准命令格式

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

代码

-- 直接创建
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)主键索引

标准命令格式

CREATE TABLE 表名(
  字段名 类型 PRIMARY KEY AUTO_INCREMENT
);

代码

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

补充知识点

  • 主键索引不能为空、不能重复
  • 一张表只能有一个主键

(4)组合索引

标准命令格式

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

代码

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)全文索引

标准命令格式

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

代码

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)查看索引

标准命令格式

SHOW INDEX FROM 表名;

代码

SHOW INDEX FROM tablename;
SHOW KEYS FROM tablename;
SHOW INDEX FROM renyuan\G;

(2)删除索引

标准命令格式

DROP INDEX 索引名 ON 表名;
ALTER TABLE 表名 DROP INDEX 索引名;

代码

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. 事务控制语句(格式 + 代码)

标准命令格式

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

代码

BEGIN;
COMMIT;
ROLLBACK;
SAVEPOINT sp1;
ROLLBACK TO sp1;
RELEASE SAVEPOINT sp1;
SET AUTOCOMMIT=0;
SET AUTOCOMMIT=1;

补充知识点

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

事务实操示例

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. 数据库操作

标准格式

CREATE DATABASE 库名;
USE 库名;
DROP DATABASE 库名;
SHOW DATABASES;

代码

CREATE DATABASE IF NOT EXISTS test;
USE test;

补充知识点

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

2. 数据表操作

标准格式

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

代码

CREATE TABLE user(
    id INT PRIMARY KEY AUTO_INCREMENT
) ENGINE=InnoDB;
DESC user;

补充知识点

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

四、最终总结

  1. 索引 = 查询加速,有固定创建 / 删除格式
  2. 事务 = 数据安全,要么全成要么全滚
  3. 操作表前必须 USE 库名
  4. 表引擎必须是 InnoDB
  5. 索引和事务要按需使用,平衡性能与安全

到此这篇关于MySQL 索引与事务核心知识点全解的文章就介绍到这了,更多相关myslq索引与事务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL实战记录之如何快速定位慢SQL

    MySQL实战记录之如何快速定位慢SQL

    这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL语句,下面这篇文章主要给大家介绍了关于MySQL实战记录之如何快速定位慢SQL的相关资料,需要的朋友可以参考下
    2022-03-03
  • MySQL分区表的基本入门教程

    MySQL分区表的基本入门教程

    这篇文章主要给大家介绍了关于MySQL分区表的基本入门教程,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • MySQL语句执行顺序和编写顺序实例解析

    MySQL语句执行顺序和编写顺序实例解析

    这篇文章主要介绍了MySQL语句执行顺序和编写顺序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • MySQL索引失效场景及解决方案

    MySQL索引失效场景及解决方案

    这篇文章主要介绍了MySQL索引失效场景及解决方案,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • MySQL实现查询处理JSON数据的示例详解

    MySQL实现查询处理JSON数据的示例详解

    这篇文章主要为大家详细介绍了MySQL如何实现查询处理JSON数据,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2023-06-06
  • Mysql MVCC多版本并发控制详情

    Mysql MVCC多版本并发控制详情

    这篇文章主要介绍了Mysql MVCC多版本并发控制详情,MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存,下文更多相关介绍需要的小伙伴可以参考一下
    2022-04-04
  • MySQL 中 Varchar(50) 和 varchar(500) 区别介绍

    MySQL 中 Varchar(50) 和 varchar(500) 区别介绍

    网上说Varchar(50)和varchar(500)存储空间上是一样的,真的是这样吗,基于性能考虑,是因为过长的字段会影响到查询性能,本文我将带着这两个问题探讨验证一下,需要的朋友可以参考下
    2024-08-08
  • MySQL中联合主键的操作方式

    MySQL中联合主键的操作方式

    MySQL联合主键操作包括创建、新增和修改,创建时在表定义中使用PRIMARY KEY关键字指定多个字段,新增和修改时,分别使用ALTER TABLE语句删除旧主键并添加新主键
    2024-12-12
  • mysql求和函数使用示例

    mysql求和函数使用示例

    求和函数在某些有计算的情况下会使用到,在本将为大家介绍下mysql中时如何实现求和的,感兴趣的朋友可以参考下,希望对大家有所帮助
    2013-09-09
  • 通过MySQL优化Discuz!的热帖翻页的技巧

    通过MySQL优化Discuz!的热帖翻页的技巧

    这篇文章主要介绍了通过MySQL优化Discuz!的热帖翻页的技巧,包括更新索引来降低服务器负载等方面,需要的朋友可以参考下
    2015-05-05

最新评论