一、MySQL 索引
1. 索引基础认知
索引是数据库中排好序的索引值 + 数据行物理地址的列表,作用类似图书目录,能通过二分查找快速定位数据,避免全表扫描,大幅提升查询效率;但索引会占用额外磁盘空间,且增删改操作会因维护索引变慢,需按需创建。
补充知识点
MySQL 默认索引结构是 B + 树,查询效率极高。索引会加快查询,但会减慢增删改。小表、重复值多的字段不适合建索引。2. 索引的分类
(1)物理分类:聚簇索引 & 非聚簇索引
聚簇索引:按数据物理存储位置排序,多行检索速度快(InnoDB 主键默认是聚簇索引)非聚簇索引:索引与数据物理存储分离,单行检索速度快(MyISAM 默认非聚簇索引)补充知识点
一张表只能有一个聚簇索引(主键)。非聚簇索引需要回表查询,效率略低。(2)逻辑分类(核心常用)
表格
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. 创建索引的核心原则
- 查多增删改少的表适合建索引,小表无需建索引WHERE、JOIN、GROUP BY、ORDER BY 字段优先建索引低基数字段(性别、状态)不建索引大字段用前缀索引组合索引严格遵循最左前缀原则
二、MySQL 事务
1. 事务基础认知
事务是一组不可分割的操作,要么全部成功,要么全部回滚,保证数据安全。
只有 InnoDB 支持事务只管理 INSERT/UPDATE/DELETE补充知识点
事务用于保证数据一致性,如转账、订单、支付。事务失败会自动回滚,不会产生脏数据。2. 事务的 ACID 四大特性
原子性:不可分割,全成功或全失败一致性:数据前后规则不变隔离性:并发事务互不干扰持久性:提交后永久生效补充知识点
ACID 是事务的核心标准。原子性保证操作安全,一致性保证数据不乱。3. 事务的隔离级别
InnoDB 默认:可重复读(REPEATABLE READ)
- 读未提交:脏读读提交:不可重复读可重复读:幻读串行化:无问题,但性能低
补充知识点
脏读:读到未提交的数据不可重复读:同一事务两次查询结果不同幻读:查询时突然多 / 少了数据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 表名:快速查看表结构。四、最终总结
- 索引 = 查询加速,有固定创建 / 删除格式事务 = 数据安全,要么全成要么全滚操作表前必须 USE 库名表引擎必须是 InnoDB索引和事务要按需使用,平衡性能与安全
到此这篇关于MySQL 索引与事务核心知识点全解的文章就介绍到这了,
