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/BIGINTFLOAT/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. ExtraUsing 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 优化五大模块,建议结合本文案例实操巩固。