MySQL 从基础到高级完整实战教程(万字总结博客)

前言

MySQL 是互联网后端最主流的关系型数据库,无论业务开发、数据分析、面试都为必考内容。本文分为基础入门、SQL 进阶、存储引擎、索引原理、事务与锁、SQL 性能优化、高级特性、高可用架构、分库分表、运维与故障排查十大模块,覆盖从零基础写 CRUD 到千万级分布式数据库完整知识体系,适配 MySQL 8.0 主流版本,可直接用于学习、复习、面试复盘。

一、MySQL 基础入门

1. 数据库核心概念

  • 数据库 DB:存储结构化数据的仓库;
  • 数据库管理系统 DBMS:MySQL、Oracle 等软件,管理数据库;
  • SQL 结构化查询语言 :操作数据库的标准语句,分为四类:
    1. DDL 数据定义:CREATE/ALTER/DROP(库、表、索引)
    2. DML 数据操作:INSERT/UPDATE/DELETE/SELECT(增删改查)
    3. DCL 数据控制:GRANT/REVOKE(权限管理)
    4. TCL 事务控制:COMMIT/ROLLBACK/SAVEPOINT

2. 数据库基础操作

sql

复制代码
-- 查看所有数据库
SHOW DATABASES;
-- 创建数据库
CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 切换数据库
USE test_db;
-- 删除数据库
DROP DATABASE IF EXISTS test_db;

3. 数据表管理

3.1 建表语法

sql

复制代码
CREATE TABLE `user` (
  id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
  username VARCHAR(50) NOT NULL COMMENT '用户名',
  age TINYINT DEFAULT 0 COMMENT '年龄',
  phone CHAR(11) UNIQUE COMMENT '手机号',
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
3.2 常用表操作

sql

复制代码
-- 查看表结构
DESC user;
SHOW CREATE TABLE user;
-- 修改表
ALTER TABLE user ADD email VARCHAR(100); -- 新增字段
ALTER TABLE user MODIFY email VARCHAR(120); -- 修改字段类型
ALTER TABLE user DROP COLUMN email; -- 删除字段
ALTER TABLE user RENAME TO t_user; -- 修改表名
-- 删除表
DROP TABLE IF EXISTS t_user;

4. 数据类型与约束

4.1 常用数据类型
  1. 数值:TINYINT/SMALLINT/INT/BIGINT、FLOAT/DOUBLE/DECIMAL(金额必用 DECIMAL)
  2. 字符串:CHAR固定长度、VARCHAR可变、TEXT大文本;统一使用utf8mb4支持 emoji
  3. 时间:DATE日期、DATETIME时分秒、TIMESTAMP时间戳(自动更新)
4.2 六大约束
  • PRIMARY KEY主键:唯一非空,一张表仅一个
  • UNIQUE唯一:字段值不可重复,允许单个 null
  • NOT NULL非空:字段必须赋值
  • DEFAULT默认值:无传入时填充默认数据
  • FOREIGN KEY外键:维护表关联(InnoDB 支持,开发极少使用)
  • AUTO_INCREMENT自增:仅整数主键使用

5. 基础 CRUD 语句

sql

复制代码
-- 新增
INSERT INTO user(username,age) VALUES('张三',20),('李四',22);
-- 查询
SELECT id,username FROM user WHERE age>18 ORDER BY id DESC LIMIT 10;
-- 更新(必须加WHERE,避免全表更新)
UPDATE user SET age=21 WHERE id=1;
-- 删除(推荐逻辑删除,不物理删除)
DELETE FROM user WHERE id=1;

二、SQL 进阶查询(业务开发核心)

1. 条件、聚合、分组

  • 运算符:> < >= <= = != AND OR LIKE %通配符 IN BETWEEN IS NULL
  • 聚合函数:COUNT/SUM/AVG/MAX/MIN

sql

复制代码
-- 统计每个年龄段人数
SELECT age,COUNT(*) cnt FROM user GROUP BY age HAVING cnt>1;

WHERE过滤原始数据,HAVING过滤分组后结果。

2. 多表连接查询

  1. INNER JOIN内连接:只返回两边匹配数据
  2. LEFT JOIN左连接:左表全部,右表匹配不到填充 null
  3. RIGHT JOIN右连接
  4. CROSS JOIN笛卡尔积(禁止无关联条件使用)

sql

复制代码
SELECT u.username,o.order_no 
FROM user u 
LEFT JOIN orders o ON u.id=o.user_id;

3. 子查询

  • WHERE 子查询:IN / EXISTS(EXISTS 效率高于 IN)
  • FROM 子查询:派生表,必须别名

sql

复制代码
-- EXISTS 高效写法
SELECT * FROM user u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id=u.id);

4. MySQL8.0 窗口函数

分组内排序、排名,分页统计必备:ROW_NUMBER()、RANK()、DENSE_RANK()、OVER()

sql

复制代码
-- 按用户分组,订单金额降序排名
SELECT user_id,amount,ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY amount DESC) rn FROM orders;

5. 分页、去重、函数

  • 去重:DISTINCT
  • 分页:LIMIT offset,size;百万级分页优化 WHERE id>上一页最大ID LIMIT 10
  • 常用函数:IFNULL、DATE_FORMAT、SUBSTRING、CONCAT

三、存储引擎(底层存储机制)

主流引擎对比

表格

特性 InnoDB (默认) MyISAM Memory
事务支持 ✅ ❌ ❌
行锁 / 表锁 行锁 (支持并发) 仅表锁 表锁
MVCC ✅ ❌ ❌
外键 ✅ ❌ ❌
崩溃恢复 ✅ redo/undo 日志 ❌ ❌
索引 聚簇索引 非聚簇索引 内存哈希索引

InnoDB 核心优势(生产唯一选择)

  1. 支持事务 ACID,保证数据一致性;
  2. MVCC 多版本并发控制,读写不阻塞;
  3. 行级锁,高并发场景性能更好;
  4. 崩溃自动恢复,数据安全;
  5. 支持外键、自增、事务隔离。

存储文件

  • .ibd独立表空间(数据 + 索引)
  • .frm表结构文件
  • ibdata1 共享表空间、redo 日志、undo 日志

四、索引原理与优化(性能核心)

1. 索引底层结构:B + 树

MySQL InnoDB 索引全部采用 B + 树,优势:

  1. 磁盘 IO 更少:树高度 3~4 层,查询仅 3~4 次磁盘读取;
  2. 范围查询友好:叶子节点双向链表有序;
  3. 非叶子仅存主键,内存可缓存更多索引节点。

2. 索引分类

  1. 聚簇索引(主键索引) 每张表仅有一个,叶子节点存储完整行数据;主键推荐使用自增 BIGINT(有序减少页分裂)。
  2. 二级索引(普通索引) 叶子仅存储主键值,查询时需要回表获取完整数据。
  3. 联合索引(复合索引) 多字段组合索引,遵循最左前缀匹配原则。
  4. 覆盖索引 查询字段全部包含在索引内,无需回表,性能最优。
  5. 唯一索引:字段值唯一;全文索引、哈希索引。

3. 索引失效高频场景(面试必背)

  1. 联合索引不满足最左前缀;
  2. 字段使用函数运算 WHERE DATE(create_time)='2026-01-01';
  3. 隐式类型转换(字符串字段传数字);
  4. 使用!=、<>、NOT IN、IS NOT NULL;
  5. LIKE %关键词(前置通配符);
  6. OR 左右字段无索引。

4. 索引设计规范

  1. 高频 WHERE、JOIN、ORDER BY 字段建索引;
  2. 联合索引区分度高字段放左侧;
  3. 索引不宜过多,增删改会维护索引,损耗性能;
  4. 禁止大字符串、NULL 字段建索引;
  5. 优先使用覆盖索引避免回表。

5. 索引操作命令

sql

复制代码
-- 创建普通索引
CREATE INDEX idx_user_name ON user(username);
-- 创建联合索引
CREATE INDEX idx_user_age_phone ON user(age,phone);
-- 删除索引
DROP INDEX idx_user_name ON user;
-- 查看索引
SHOW INDEX FROM user;

五、事务、MVCC 与锁机制(并发核心)

1. 事务四大特性 ACID

  • 原子性 Atomic:全部执行或全部回滚,undo 日志实现;
  • 一致性 Consistent:事务前后数据合法;
  • 隔离性 Isolation:事务间互不干扰,锁 + MVCC 实现;
  • 持久性 Durable:提交后数据永久落地,redo 日志刷盘。

2. 四大事务隔离级别(由低到高)

表格

隔离级别 脏读 不可重复读 幻读
READ UNCOMMITTED 读未提交 ✅ ✅ ✅
READ COMMITTED 读已提交 RC ❌ ✅ ✅
REPEATABLE READ 可重复读 RR(MySQL 默认) ❌ ❌ 解决(间隙锁)
SERIALIZABLE 串行化 ❌ ❌ ❌

3. MVCC 多版本并发控制

InnoDB 实现无锁读的核心机制,基于 undo 日志版本链 + Read View:

  1. 每条记录隐藏字段trx_id事务 ID、roll_ptr回滚指针;
  2. 每次更新生成 undo 日志旧版本,形成版本链表;
  3. RR 隔离级别下,事务启动生成 Read View,判断数据版本可见性;
  4. 快照读(普通 SELECT)不加锁,当前读(UPDATE/DELETE)加行锁。

4. InnoDB 锁体系

  1. 锁粒度
    • 表锁:全表锁定,并发差;
    • 行锁:仅锁定匹配行,高并发友好;
    • 间隙锁 GAP + 临键锁 Next-key:RR 级别防止幻读,锁定数据区间。
  2. 锁类型
    • 共享锁 S:读锁,多事务共享;
    • 排他锁 X:写锁,互斥;
  3. 死锁 多个事务互相持有对方所需锁,解决方案:
    • 统一事务操作资源顺序;
    • 缩短事务执行时间;
    • 设置锁超时innodb_lock_wait_timeout=50;
    • MySQL 自动检测死锁回滚代价小的事务。

5. 事务语法

sql

复制代码
START TRANSACTION; -- 开启事务
UPDATE user SET age=20 WHERE id=1;
COMMIT; -- 提交持久化
-- ROLLBACK; 回滚撤销

六、SQL 性能优化(生产必备)

1. Explain 执行计划(排查慢 SQL 神器)

EXPLAIN SELECT * FROM user WHERE id=1; 重点字段解读:

  1. type:最优到最差 system>const>eq_ref>ref>range>index>ALL,杜绝 ALL 全表扫描;
  2. key:实际使用索引;
  3. rows:扫描行数,越小越好;
  4. Extra:Using filesort文件排序、Using temporary临时表,必须优化。

2. SQL 编写规范

  1. 禁止SELECT *,只查需要字段,减少回表与 IO;
  2. 避免大 JOIN、多表关联,小表驱动大表;
  3. 分页优化:WHERE id>1000 LIMIT 10替代LIMIT 1000,10;
  4. 批量操作使用INSERT VALUES(),(),(),减少 IO;
  5. 减少子查询嵌套,改用 JOIN;
  6. 金额使用DECIMAL,时间使用DATETIME,不使用字符串存日期;
  7. 字段尽量 NOT NULL,NULL 无法优化索引。

3. 慢查询日志定位问题

开启慢查询,记录执行超过指定时间的 SQL:

ini

复制代码
slow_query_log=ON
long_query_time=1
slow_query_log_file=/var/log/mysql/slow.log

使用mysqldumpslow分析慢日志。

4. 表结构优化

  1. 单表字段控制 20 个以内,拆分大 TEXT/BLOB;
  2. 主键自增 BIGINT,避免字符串主键;
  3. 冷热数据分离,大字段单独分表;
  4. 适当反范式,减少 JOIN 次数(空间换时间)。

七、MySQL 高级特性

1. 视图 VIEW

虚拟表,封装复杂查询,简化开发,不存储真实数据;不适合频繁更新场景。

sql

复制代码
CREATE VIEW v_user_order AS SELECT u.username,o.order_no FROM user u LEFT JOIN orders o ON u.id=o.user_id;

2. 存储过程 / 函数

预编译 SQL 集合,适合批量统计;开发中极少使用,可读性差、难以维护。

3. 触发器 TRIGGER

增删改前后自动执行逻辑,用于数据同步、审计;线上慎用,隐藏业务逻辑,故障难排查。

4. 事务保存点 SAVEPOINT

长事务分段回滚,局部撤销操作。

5. 日志体系(MySQL 底层)

  1. redo 重做日志:崩溃恢复,事务提交前写入,保证持久性;
  2. undo 回滚日志:事务回滚、MVCC 版本链;
  3. binlog 二进制日志:记录所有 DML/DDL,主从复制、数据恢复;
  4. 慢查询日志、错误日志、通用查询日志。

八、主从复制与高可用架构

1. 主从复制原理

  1. Master 写入数据,记录 binlog;
  2. Slave IO 线程拉取 binlog 到本地 relay 日志;
  3. Slave SQL 线程重放日志,同步数据;

2. 复制模式

  • 异步复制:主库写完直接返回,从库异步同步,丢失风险;
  • 半同步复制:至少一个从库接收 binlog 才返回,数据更安全;

3. 主从架构用途

读写分离(主写从读)、数据备份、分库前置、异地容灾。

4. 高可用方案

  1. MGR MySQL 组复制(官方高可用);
  2. MGR+ProxySQL 故障自动切换;
  3. Keepalived + 双主。

九、分库分表(千万 / 亿级数据解决方案)

单表数据超过 500 万、查询性能严重下降时分库分表。

1. 拆分方式

  1. 垂直拆分:按业务模块分库;大表按字段拆分(冷热分离);
  2. 水平拆分 :同一张表按规则拆分多张子表;
    • 分片规则:ID 哈希、时间范围、用户 ID 取模;

2. 中间件

  • MyCat、Sharding-JDBC(Java 主流,无代理);

3. 分片痛点

分布式事务、跨分片 JOIN、分页排序、ID 全局唯一、扩容重分片。

十、运维、备份与故障排查

1. 数据备份恢复

  1. 逻辑备份:mysqldump全库 / 单表导出 SQL,适合小库;
  2. 物理备份:XtraBackup 热备份,不锁表,大库首选;
  3. 基于 binlog 时间点恢复,找回误删数据。

2. 日常运维参数优化

核心 my.cnf 配置:

  • innodb_buffer_pool_size:缓冲池,物理内存 50%~70%;
  • innodb_log_file_size:redo 日志大小;
  • max_connections:最大连接数;
  • sort_buffer_size、join_buffer_size会话缓冲区。

3. 常见故障排查

  1. 连接数爆满:慢 SQL 长事务占用连接;
  2. 锁等待超时:长事务、无索引导致表锁;
  3. 磁盘 IO 打满:无索引全表扫描、大批量写入;
  4. 自增 ID 重置:InnoDB 内存存储自增值,重启丢失未持久化最大值。

十一、学习路线总结

  1. 基础阶段:SQL 增删改查、库表设计、数据约束;
  2. 进阶阶段:多表查询、窗口函数、视图;
  3. 原理阶段:InnoDB 引擎、B + 树索引、事务隔离、MVCC 锁;
  4. 优化阶段:Explain、慢 SQL、索引调优、表结构优化;
  5. 架构阶段:主从复制、读写分离、分库分表、高可用;
  6. 运维阶段:备份恢复、参数调优、故障定位。

结语

MySQL 优化没有万能方案,核心遵循先索引、再 SQL、后架构的优化顺序。绝大多数线上性能问题都源于不合理索引与劣质 SQL,掌握底层 B + 树、MVCC、锁机制才能从根源解决并发与性能问题。千万级数据场景下,分库分表是最终方案,但架构拆分带来复杂度提升,优先通过索引、读写分离优化,避免过早引入分布式分片。 后端开发、大数据、测试岗位面试 MySQL 高频考点集中在索引、事务隔离、MVCC、锁、SQL 优化五大模块,建议结合本文案例实操巩固。