MySQL 学习目标

下面给你一份面向工作的 MySQL 学习知识清单 。建议以 MySQL 8.0 + InnoDB 为主学习,因为目前企业中使用最广泛。


一、MySQL 学习目标

以后工作中使用 MySQL,核心目标是:

  1. 会写常见和复杂 SQL
  2. 会设计合理的表结构
  3. 会建立和优化索引
  4. 会分析慢 SQL
  5. 理解事务、锁、MVCC
  6. 知道 MySQL 的存储原理
  7. 会做基本的备份、恢复、权限管理
  8. 能处理常见线上问题

二、数据库基础知识

1. 数据库基本概念

需要掌握:

  • 数据库 Database
  • 数据表 Table
  • 字段 Column
  • 行记录 Row
  • 主键 Primary Key
  • 外键 Foreign Key
  • 索引 Index
  • 视图 View
  • 事务 Transaction
  • 存储过程 Procedure
  • 触发器 Trigger

2. 关系型数据库理论

了解:

  • 关系型数据库 RDBMS
  • SQL 标准
  • 表与表之间的关系:
    • 一对一
    • 一对多
    • 多对多
  • 实体关系模型 ER 图
  • 数据库范式:
    • 第一范式 1NF
    • 第二范式 2NF
    • 第三范式 3NF
  • 反范式设计

三、MySQL 安装与环境

1. 安装方式

需要会:

  • Windows 安装 MySQL
  • Linux 安装 MySQL
  • Docker 安装 MySQL
  • 使用 MySQL 8.0
  • 配置环境变量
  • 启动、停止、重启 MySQL 服务

2. 常用客户端工具

建议熟悉:

  • MySQL 命令行客户端
  • Navicat
  • DBeaver
  • DataGrip
  • MySQL Workbench

3. 配置文件

需要了解:

  • my.cnf
  • my.ini
  • MySQL 配置文件位置
  • 常见配置项:
    • port
    • datadir
    • character_set_server
    • collation_server
    • max_connections
    • innodb_buffer_pool_size

四、SQL 基础

1. SQL 分类

必须掌握:

DDL:数据定义语言

用于操作数据库结构。

sql 复制代码
CREATE
ALTER
DROP
TRUNCATE

DML:数据操作语言

用于操作数据。

sql 复制代码
INSERT
UPDATE
DELETE

DQL:数据查询语言

用于查询数据。

sql 复制代码
SELECT

DCL:数据控制语言

用于权限控制。

sql 复制代码
GRANT
REVOKE

TCL:事务控制语言

用于事务控制。

sql 复制代码
COMMIT
ROLLBACK
SAVEPOINT

五、数据库与表操作

1. 数据库操作

需要掌握:

sql 复制代码
CREATE DATABASE
DROP DATABASE
SHOW DATABASES
USE database_name

2. 表操作

需要掌握:

sql 复制代码
CREATE TABLE
DROP TABLE
ALTER TABLE
DESC table_name
SHOW TABLES
SHOW CREATE TABLE

3. 修改表结构

需要掌握:

  • 添加字段
  • 删除字段
  • 修改字段类型
  • 修改字段名
  • 添加索引
  • 删除索引
  • 添加约束
  • 删除约束

例如:

sql 复制代码
ALTER TABLE user ADD COLUMN age INT;
ALTER TABLE user MODIFY COLUMN name VARCHAR(100);
ALTER TABLE user DROP COLUMN age;

六、MySQL 数据类型

1. 整数类型

需要掌握:

  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • INT
  • BIGINT

重点:

  • 有符号和无符号:SIGNED / UNSIGNED
  • 自增:AUTO_INCREMENT

2. 小数类型

必须掌握:

  • DECIMAL
  • FLOAT
  • DOUBLE

工作中注意:

  • 金额、余额、价格必须使用 DECIMAL
  • 不要用 FLOATDOUBLE 存钱

例如:

sql 复制代码
price DECIMAL(10, 2)

3. 字符串类型

需要掌握:

  • CHAR
  • VARCHAR
  • TEXT
  • MEDIUMTEXT
  • LONGTEXT

区别:

  • CHAR:定长
  • VARCHAR:变长
  • TEXT:大文本

常见使用:

sql 复制代码
username VARCHAR(50)
content TEXT

4. 日期时间类型

需要掌握:

  • DATE
  • TIME
  • DATETIME
  • TIMESTAMP
  • YEAR

重点区别:

  • DATETIME 范围更大,不受时区影响
  • TIMESTAMP 会受时区影响

工作中常用:

sql 复制代码
create_time DATETIME
update_time DATETIME

5. JSON 类型

MySQL 5.7 之后支持:

sql 复制代码
data JSON

适合存储半结构化数据,但不要滥用。


七、字符集与排序规则

必须掌握:

1. 字符集

常见字符集:

  • utf8
  • utf8mb4

工作建议:

sql 复制代码
utf8mb4

因为 utf8mb4 支持 emoji 和完整 Unicode。

2. 排序规则 Collation

常见:

  • utf8mb4_general_ci
  • utf8mb4_unicode_ci
  • utf8mb4_0900_ai_ci

注意:

  • ci 表示大小写不敏感
  • cs 表示大小写敏感

3. 常见问题

需要了解:

  • 中文乱码
  • emoji 存储失败
  • 字符集不一致导致索引失效
  • 表、字段、连接字符集不一致

八、约束

必须掌握:

1. 主键约束

sql 复制代码
PRIMARY KEY

特点:

  • 唯一
  • 非空
  • 一张表只能有一个主键

2. 唯一约束

sql 复制代码
UNIQUE

用于保证字段唯一,例如手机号、邮箱。

3. 非空约束

sql 复制代码
NOT NULL

4. 默认值

sql 复制代码
DEFAULT

5. 外键约束

sql 复制代码
FOREIGN KEY

工作中外键不一定常用,很多公司会在业务层维护关系。

6. CHECK 约束

MySQL 8.0 支持:

sql 复制代码
CHECK (age > 0)

九、增删改查

1. 插入数据

需要掌握:

sql 复制代码
INSERT INTO table_name VALUES (...);
INSERT INTO table_name(column1, column2) VALUES (...);

批量插入:

sql 复制代码
INSERT INTO user(name, age)
VALUES 
('Tom', 18),
('Jerry', 20);

2. 查询数据

必须熟练:

sql 复制代码
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT

3. 修改数据

sql 复制代码
UPDATE user SET name = 'Tom' WHERE id = 1;

注意:

  • 修改数据必须加 WHERE
  • 线上禁止无条件更新

4. 删除数据

sql 复制代码
DELETE FROM user WHERE id = 1;

注意区分:

sql 复制代码
DELETE
TRUNCATE
DROP

区别:

  • DELETE 删除数据,可带条件
  • TRUNCATE 清空整张表
  • DROP 删除整张表结构

十、查询条件

必须掌握:

sql 复制代码
WHERE
AND
OR
NOT
IN
NOT IN
BETWEEN AND
LIKE
IS NULL
IS NOT NULL
EXISTS

注意:

sql 复制代码
= NULL

是错误写法,应该使用:

sql 复制代码
IS NULL

十一、排序、分页、去重

1. 排序

sql 复制代码
ORDER BY create_time DESC

2. 分页

sql 复制代码
LIMIT 0, 10
LIMIT 10 OFFSET 0

3. 去重

sql 复制代码
SELECT DISTINCT name FROM user;

4. 深分页问题

例如:

sql 复制代码
SELECT * FROM user ORDER BY id LIMIT 1000000, 10;

这种 SQL 在大表中性能差。

优化方式:

sql 复制代码
SELECT * FROM user 
WHERE id > 1000000 
ORDER BY id 
LIMIT 10;

十二、聚合函数与分组

必须掌握:

sql 复制代码
COUNT()
SUM()
AVG()
MAX()
MIN()

分组查询:

sql 复制代码
SELECT department_id, COUNT(*)
FROM employee
GROUP BY department_id;

分组后过滤:

sql 复制代码
SELECT department_id, COUNT(*)
FROM employee
GROUP BY department_id
HAVING COUNT(*) > 10;

注意:

  • WHERE 是分组前过滤
  • HAVING 是分组后过滤

十三、多表查询

必须掌握:

1. 内连接

sql 复制代码
SELECT *
FROM user u
INNER JOIN orders o ON u.id = o.user_id;

2. 左连接

sql 复制代码
SELECT *
FROM user u
LEFT JOIN orders o ON u.id = o.user_id;

3. 右连接

sql 复制代码
SELECT *
FROM user u
RIGHT JOIN orders o ON u.id = o.user_id;

4. 自连接

一张表自己关联自己。

5. 多表关联优化

需要注意:

  • 关联字段要建立索引
  • 小表驱动大表
  • 避免过多 JOIN
  • 注意 JOIN 条件是否正确
  • 注意笛卡尔积

十四、子查询

需要掌握:

1. WHERE 子查询

sql 复制代码
SELECT * FROM user
WHERE id IN (
    SELECT user_id FROM orders
);

2. FROM 子查询

sql 复制代码
SELECT *
FROM (
    SELECT user_id, COUNT(*) cnt
    FROM orders
    GROUP BY user_id
) t;

3. EXISTS 子查询

sql 复制代码
SELECT *
FROM user u
WHERE EXISTS (
    SELECT 1 FROM orders o WHERE o.user_id = u.id
);

4. 子查询优化

需要了解:

  • IN
  • EXISTS
  • JOIN

不同场景性能可能不同,要结合执行计划分析。


十五、常用函数

1. 字符串函数

sql 复制代码
CONCAT()
SUBSTRING()
LENGTH()
CHAR_LENGTH()
TRIM()
REPLACE()
LOWER()
UPPER()

2. 日期函数

sql 复制代码
NOW()
CURDATE()
CURTIME()
DATE_FORMAT()
DATE_ADD()
DATE_SUB()
DATEDIFF()

3. 数学函数

sql 复制代码
ROUND()
CEIL()
FLOOR()
ABS()
RAND()

4. 条件函数

sql 复制代码
IF()
IFNULL()
NULLIF()
CASE WHEN

例如:

sql 复制代码
SELECT 
    CASE 
        WHEN score >= 90 THEN '优秀'
        WHEN score >= 60 THEN '及格'
        ELSE '不及格'
    END AS level
FROM student;

十六、索引

索引是 MySQL 工作中非常重要的知识点。

1. 索引的作用

索引用于提高查询速度。

优点:

  • 加快查询
  • 加快排序
  • 加快分组
  • 加快关联查询

缺点:

  • 占用磁盘空间
  • 降低写入速度
  • 索引过多会影响维护成本

2. 常见索引类型

需要掌握:

  • 主键索引
  • 唯一索引
  • 普通索引
  • 联合索引
  • 前缀索引
  • 全文索引
  • 空间索引

3. 创建索引

sql 复制代码
CREATE INDEX idx_user_name ON user(name);

联合索引:

sql 复制代码
CREATE INDEX idx_user_age_name ON user(age, name);

唯一索引:

sql 复制代码
CREATE UNIQUE INDEX uk_user_phone ON user(phone);

4. B+ 树索引

必须理解:

  • MySQL InnoDB 默认使用 B+ 树索引
  • B+ 树适合范围查询
  • 非叶子节点存索引值
  • 叶子节点存数据或主键值

5. 聚簇索引与二级索引

InnoDB 中:

  • 主键索引是聚簇索引
  • 数据和主键索引存放在一起
  • 二级索引叶子节点存的是主键值
  • 通过二级索引查数据可能发生回表

6. 回表

例如有索引:

sql 复制代码
INDEX(name)

查询:

sql 复制代码
SELECT age FROM user WHERE name = 'Tom';

如果 age 不在索引中,需要通过主键再查一次完整数据,这就是回表。

7. 覆盖索引

如果查询字段都在索引中,就不需要回表。

例如:

sql 复制代码
CREATE INDEX idx_name_age ON user(name, age);

查询:

sql 复制代码
SELECT name, age FROM user WHERE name = 'Tom';

这就是覆盖索引。

8. 最左前缀原则

联合索引:

sql 复制代码
INDEX(a, b, c)

可以命中:

sql 复制代码
WHERE a = ?
WHERE a = ? AND b = ?
WHERE a = ? AND b = ? AND c = ?

不一定能很好命中:

sql 复制代码
WHERE b = ?
WHERE c = ?
WHERE b = ? AND c = ?

9. 索引失效场景

必须掌握:

  • 对索引字段使用函数
sql 复制代码
WHERE DATE(create_time) = '2024-01-01'
  • 隐式类型转换
sql 复制代码
WHERE phone = 13800138000

如果 phone 是字符串,应该写:

sql 复制代码
WHERE phone = '13800138000'
  • 左模糊查询
sql 复制代码
WHERE name LIKE '%Tom'
  • 使用 OR 不当
  • 联合索引不满足最左前缀
  • 使用 !=<>NOT IN
  • 字段区分度太低
  • 排序字段和索引不匹配

十七、执行计划 EXPLAIN

必须掌握。

1. 查看执行计划

sql 复制代码
EXPLAIN SELECT * FROM user WHERE id = 1;

MySQL 8.0 可以使用:

sql 复制代码
EXPLAIN ANALYZE SELECT * FROM user WHERE id = 1;

2. 重点字段

需要看懂:

  • id
  • select_type
  • table
  • type
  • possible_keys
  • key
  • key_len
  • ref
  • rows
  • filtered
  • Extra

3. type 性能顺序

大致从好到差:

text 复制代码
system
const
eq_ref
ref
range
index
ALL

重点:

  • 看到 ALL 一般表示全表扫描,需要关注
  • 看到 Using filesort 要关注排序
  • 看到 Using temporary 要关注临时表
  • 看到 Using index 通常表示使用覆盖索引

十八、事务

必须掌握。

1. 事务四大特性 ACID

  • Atomicity:原子性
  • Consistency:一致性
  • Isolation:隔离性
  • Durability:持久性

2. 事务控制

sql 复制代码
START TRANSACTION;
COMMIT;
ROLLBACK;

3. 自动提交

sql 复制代码
SHOW VARIABLES LIKE 'autocommit';
SET autocommit = 0;
SET autocommit = 1;

4. 事务隔离级别

必须掌握:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

MySQL InnoDB 默认:

text 复制代码
REPEATABLE READ

5. 并发问题

需要理解:

  • 脏读
  • 不可重复读
  • 幻读
  • 丢失更新

十九、锁机制

工作中非常重要。

1. 锁类型

需要掌握:

  • 全局锁
  • 表锁
  • 行锁
  • 间隙锁 Gap Lock
  • 临键锁 Next-Key Lock
  • 记录锁 Record Lock
  • 意向锁
  • 元数据锁 MDL

2. 当前读与快照读

快照读:

sql 复制代码
SELECT * FROM user WHERE id = 1;

当前读:

sql 复制代码
SELECT * FROM user WHERE id = 1 FOR UPDATE;
SELECT * FROM user WHERE id = 1 LOCK IN SHARE MODE;
UPDATE user SET name = 'Tom' WHERE id = 1;
DELETE FROM user WHERE id = 1;

3. 死锁

需要掌握:

  • 死锁产生原因
  • 如何查看死锁
sql 复制代码
SHOW ENGINE INNODB STATUS;
  • 如何避免死锁:
    • 固定访问顺序
    • 缩短事务时间
    • 合理建立索引
    • 避免大事务
    • 死锁后业务重试

二十、MVCC

MVCC 是 MySQL InnoDB 的核心。

需要理解:

  • 什么是 MVCC
  • MVCC 如何实现非锁定读
  • undo log
  • read view
  • 事务 ID
  • 版本链
  • 快照读
  • 当前读

重点区别:

  • READ COMMITTED:每次查询生成新的 Read View
  • REPEATABLE READ:事务第一次查询生成 Read View,后续复用

二十一、InnoDB 存储引擎

MySQL 工作中主要学习 InnoDB。

1. 常见存储引擎

了解:

  • InnoDB
  • MyISAM
  • MEMORY
  • CSV
  • Archive

重点掌握 InnoDB。

2. InnoDB 特点

  • 支持事务
  • 支持行锁
  • 支持外键
  • 支持 MVCC
  • 崩溃恢复能力强

3. InnoDB 核心结构

需要了解:

  • 表空间
  • 数据页 Page
  • 区 Extent
  • 段 Segment
  • Buffer Pool
  • Redo Log
  • Undo Log
  • Change Buffer
  • Doublewrite Buffer
  • Adaptive Hash Index

二十二、MySQL 日志

必须掌握。

1. Error Log

错误日志,用于排查 MySQL 启动、运行错误。

2. General Log

通用查询日志,记录所有 SQL,一般生产环境不长期开启。

3. Slow Query Log

慢查询日志,用于分析慢 SQL。

需要会配置:

sql 复制代码
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';

4. Binary Log

简称 binlog,用于:

  • 主从复制
  • 数据恢复
  • 审计

需要了解格式:

  • STATEMENT
  • ROW
  • MIXED

工作中一般推荐:

text 复制代码
ROW

5. Redo Log

InnoDB 重做日志,用于保证事务持久性。

6. Undo Log

用于:

  • 事务回滚
  • MVCC 版本链

7. Relay Log

主从复制中,从库使用的中继日志。


二十三、SQL 优化

工作中高频使用。

1. 优化方向

需要掌握:

  • 表结构优化
  • 索引优化
  • SQL 写法优化
  • 分页优化
  • JOIN 优化
  • 排序优化
  • 分组优化
  • 慢查询分析

2. 常见优化原则

建议掌握:

  • 不要 SELECT *
  • 查询字段尽量明确
  • WHERE 条件字段建立合适索引
  • 避免索引字段参与函数计算
  • 避免隐式类型转换
  • 避免大事务
  • 避免一次删除、更新大量数据
  • 合理使用联合索引
  • 避免过多索引
  • 使用覆盖索引
  • 大表深分页使用游标式分页
  • 先过滤再 JOIN
  • 尽量让排序使用索引

3. 慢 SQL 分析流程

常见流程:

  1. 查看慢查询日志
  2. 找到慢 SQL
  3. 使用 EXPLAIN
  4. 分析是否使用索引
  5. 分析扫描行数
  6. 分析是否有排序、临时表
  7. 优化 SQL 或索引
  8. 再次验证执行计划和耗时

二十四、表设计规范

工作中非常重要。

1. 常见字段设计

通常业务表会有:

sql 复制代码
id
create_time
update_time
create_by
update_by
deleted
version
status

2. 主键设计

常见主键方案:

  • 自增 ID
  • UUID
  • 雪花算法 ID
  • 业务唯一 ID

建议:

  • 单机系统可以用自增 ID
  • 分布式系统常用雪花算法 ID
  • 不建议直接用很长的字符串做主键

3. 字段设计原则

建议:

  • 字段尽量设置 NOT NULL
  • 给字段设置默认值
  • 金额使用 DECIMAL
  • 时间使用 DATETIME
  • 状态字段使用 TINYINT
  • 长文本单独放表
  • 大字段不要频繁查询
  • 字段命名清晰

4. 表设计原则

需要掌握:

  • 适当范式化
  • 适当反范式
  • 避免超宽表
  • 避免大字段和高频字段混在一起
  • 合理设计索引
  • 保留扩展字段时要谨慎
  • 不滥用 JSON

二十五、权限管理与安全

1. 用户管理

需要掌握:

sql 复制代码
CREATE USER
DROP USER
ALTER USER

例如:

sql 复制代码
CREATE USER 'app_user'@'%' IDENTIFIED BY 'password';

2. 授权

sql 复制代码
GRANT SELECT, INSERT, UPDATE ON db_name.* TO 'app_user'@'%';

3. 回收权限

sql 复制代码
REVOKE SELECT ON db_name.* FROM 'app_user'@'%';

4. 查看权限

sql 复制代码
SHOW GRANTS FOR 'app_user'@'%';

5. 安全重点

需要掌握:

  • 最小权限原则
  • 禁止应用使用 root 用户
  • 防止 SQL 注入
  • 使用预编译 SQL
  • 定期修改密码
  • 生产环境限制远程访问
  • 备份文件加密
  • 敏感字段加密或脱敏

二十六、备份与恢复

必须了解,DBA 方向必须熟练。

1. 逻辑备份

常用工具:

bash 复制代码
mysqldump

常见参数:

bash 复制代码
mysqldump -u root -p --single-transaction db_name > backup.sql

2. 物理备份

常见工具:

  • Percona XtraBackup
  • MySQL Enterprise Backup

3. 备份类型

需要掌握:

  • 全量备份
  • 增量备份
  • 差异备份
  • 定时备份
  • 冷备份
  • 热备份

4. 数据恢复

需要掌握:

  • 从 SQL 文件恢复
  • 从物理备份恢复
  • 利用 binlog 做时间点恢复

5. 工作重点

一定要记住:

只会备份不够,必须定期演练恢复。


二十七、主从复制

进阶必学。

1. 主从复制作用

用于:

  • 读写分离
  • 数据备份
  • 高可用
  • 灾备
  • 扩展读性能

2. 复制原理

需要理解:

  1. 主库写 binlog
  2. 从库 IO 线程拉取 binlog
  3. 从库写 relay log
  4. 从库 SQL 线程重放 relay log

3. 复制模式

需要了解:

  • 异步复制
  • 半同步复制
  • 组复制 MGR

4. GTID

MySQL 5.6 之后支持 GTID。

需要了解:

  • GTID 是什么
  • GTID 复制的优势
  • 如何通过 GTID 做主从切换

5. 主从问题

需要掌握:

  • 主从延迟
  • 数据不一致
  • 复制中断
  • binlog 文件过大
  • 从库只读配置
  • 主从切换

二十八、高可用与架构

了解即可,架构或 DBA 方向重点掌握。

1. 常见架构

  • 单机 MySQL
  • 主从架构
  • 一主多从
  • 双主架构
  • MGR 组复制
  • InnoDB Cluster
  • 分库分表架构

2. 常见组件

了解:

  • Keepalived
  • MHA
  • Orchestrator
  • ProxySQL
  • MyCat
  • ShardingSphere
  • Canal

3. 读写分离

需要了解:

  • 主库写
  • 从库读
  • 主从延迟问题
  • 强一致读问题

4. 分库分表

需要了解:

  • 垂直分库
  • 水平分库
  • 垂直分表
  • 水平分表
  • 分片键选择
  • 跨库 JOIN 问题
  • 分布式事务问题
  • 全局唯一 ID

二十九、监控与排查

工作中很实用。

1. 常用命令

需要熟悉:

sql 复制代码
SHOW PROCESSLIST;
SHOW FULL PROCESSLIST;
SHOW STATUS;
SHOW VARIABLES;
SHOW ENGINE INNODB STATUS;

2. 系统库

需要了解:

  • information_schema
  • performance_schema
  • mysql
  • sys

3. 重要监控指标

需要关注:

  • QPS
  • TPS
  • 慢查询数量
  • 连接数
  • 活跃线程数
  • 锁等待
  • 死锁次数
  • Buffer Pool 命中率
  • 磁盘 IO
  • CPU 使用率
  • 内存使用率
  • 主从延迟
  • binlog 大小
  • 表空间大小

4. 常用监控工具

了解:

  • Prometheus
  • Grafana
  • Percona Toolkit
  • pt-query-digest
  • Zabbix
  • MySQL Exporter

三十、MySQL 8.0 新特性

建议学习。

1. 窗口函数

例如:

sql 复制代码
ROW_NUMBER()
RANK()
DENSE_RANK()
LAG()
LEAD()

2. CTE 公共表表达式

sql 复制代码
WITH t AS (
    SELECT * FROM user
)
SELECT * FROM t;

3. 递归查询

MySQL 8.0 支持递归 CTE。

4. 角色管理

sql 复制代码
CREATE ROLE
GRANT role TO user

5. 隐藏索引

sql 复制代码
ALTER TABLE user ALTER INDEX idx_name INVISIBLE;

6. 函数索引

MySQL 8.0 支持表达式索引。

7. JSON 增强

MySQL 8.0 对 JSON 支持更好。

8. Atomic DDL

MySQL 8.0 支持原子 DDL,DDL 操作更安全。


三十一、开发中 MySQL 相关知识

如果你以后做 Java、后端开发,这部分很重要。

1. JDBC

需要掌握:

  • JDBC 连接 MySQL
  • Driver 配置
  • PreparedStatement
  • ResultSet
  • 事务提交与回滚

2. 连接池

常见连接池:

  • HikariCP
  • Druid
  • C3P0

需要理解:

  • 最大连接数
  • 最小空闲连接
  • 连接超时
  • 空闲超时
  • 连接泄漏

3. ORM 框架

常见:

  • MyBatis
  • MyBatis-Plus
  • JPA
  • Hibernate

需要注意:

  • 避免 N+1 查询
  • 避免一次查询过多数据
  • 合理分页
  • 批量插入
  • 动态 SQL
  • 事务传播机制

4. SQL 注入

必须掌握:

错误方式:

sql 复制代码
SELECT * FROM user WHERE name = '" + name + "'

正确方式:

sql 复制代码
PreparedStatement

或 MyBatis 参数绑定:

sql 复制代码
WHERE name = #{name}

不要使用:

sql 复制代码
${name}

除非非常清楚风险。


三十二、常见业务场景

工作中建议重点练习这些。

1. 用户表设计

字段:

  • id
  • username
  • phone
  • email
  • password
  • status
  • create_time
  • update_time

重点:

  • 手机号唯一索引
  • 密码加密存储
  • 状态字段设计

2. 订单表设计

字段:

  • id
  • order_no
  • user_id
  • amount
  • status
  • pay_time
  • create_time

重点:

  • 订单号唯一索引
  • 用户 ID 索引
  • 创建时间索引
  • 金额用 DECIMAL

3. 库存扣减

需要考虑:

  • 并发扣库存
  • 防止超卖
  • 悲观锁
  • 乐观锁
  • 事务隔离
  • 幂等性

4. 支付场景

需要考虑:

  • 金额精度
  • 支付状态流转
  • 重复回调
  • 幂等处理
  • 事务一致性

5. 软删除

常见字段:

sql 复制代码
deleted TINYINT DEFAULT 0

查询时:

sql 复制代码
WHERE deleted = 0

6. 乐观锁

常见字段:

sql 复制代码
version INT

更新时:

sql 复制代码
UPDATE product
SET stock = stock - 1, version = version + 1
WHERE id = 1 AND version = 10;

三十三、常见坑

必须注意:

  1. 不要用 root 用户连接业务系统
  2. 不要在生产环境随便执行 DELETEUPDATE
  3. 执行修改语句前先写 SELECT 确认条件
  4. 金额不要用浮点数
  5. 大表不要随便加字段
  6. 大表不要随便建索引
  7. 不要一次删除几百万数据
  8. 不要长期持有事务
  9. 不要滥用 SELECT *
  10. 不要让索引字段参与函数运算
  11. 不要忽视字符集
  12. 不要忽视时区问题
  13. 不要只备份不恢复测试
  14. 不要把大量 JSON 当关系型数据用
  15. 不要创建过多索引
  16. 不要认为索引一定越多越好
  17. 不要忽视慢查询日志
  18. 不要忽视主从延迟
  19. 不要忽视死锁重试
  20. 不要在事务中做耗时外部调用

三十四、学习顺序建议

建议按这个顺序学:

第一阶段:基础 SQL

重点:

  • 数据库、表操作
  • 增删改查
  • 条件查询
  • 排序分页
  • 分组聚合
  • 多表 JOIN
  • 子查询
  • 常用函数

目标:

能独立写常见业务 SQL。


第二阶段:表设计与索引

重点:

  • 数据类型选择
  • 主键设计
  • 表结构设计
  • 索引类型
  • 联合索引
  • 最左前缀原则
  • 覆盖索引
  • 索引失效
  • EXPLAIN

目标:

能设计基本业务表,并能优化简单慢 SQL。


第三阶段:事务与锁

重点:

  • ACID
  • 隔离级别
  • MVCC
  • 行锁
  • 间隙锁
  • 临键锁
  • 死锁
  • 悲观锁
  • 乐观锁

目标:

能处理并发更新、库存扣减、重复提交等问题。


第四阶段:性能优化

重点:

  • 慢查询日志
  • 执行计划
  • SQL 优化
  • 索引优化
  • 深分页优化
  • 大表优化
  • 参数调优基础

目标:

能定位并优化常见性能问题。


第五阶段:运维与架构

重点:

  • 备份恢复
  • binlog
  • 主从复制
  • 读写分离
  • 高可用
  • 分库分表
  • 监控告警

目标:

能理解企业中 MySQL 的运行方式和常见架构。


三十五、建议做的练习项目

你可以练习设计这些数据库:

  1. 学生管理系统
  2. 图书管理系统
  3. 用户登录注册系统
  4. 博客系统
  5. 电商订单系统
  6. 秒杀库存系统
  7. 支付流水系统
  8. 权限管理系统
  9. 日志查询系统
  10. 后台管理系统

重点练习:

  • 表设计
  • 索引设计
  • SQL 查询
  • 事务处理
  • 慢 SQL 优化
  • 数据备份恢复

三十六、面试常问知识点

以后找工作时,MySQL 常问:

  1. MySQL 索引底层为什么用 B+ 树?
  2. 什么是聚簇索引?
  3. 什么是回表?
  4. 什么是覆盖索引?
  5. 联合索引的最左前缀原则是什么?
  6. 哪些情况会导致索引失效?
  7. EXPLAIN 怎么看?
  8. MySQL 有哪些事务隔离级别?
  9. 什么是 MVCC?
  10. 什么是脏读、不可重复读、幻读?
  11. InnoDB 如何解决幻读?
  12. MySQL 默认隔离级别是什么?
  13. 什么是间隙锁、临键锁?
  14. 如何排查死锁?
  15. binlog、redo log、undo log 有什么区别?
  16. MySQL 主从复制原理是什么?
  17. 主从延迟怎么解决?
  18. 如何优化慢 SQL?
  19. 大表分页怎么优化?
  20. 如何设计订单表?
  21. 如何防止库存超卖?
  22. DELETE、TRUNCATE、DROP 的区别?
  23. CHAR 和 VARCHAR 的区别?
  24. DATETIME 和 TIMESTAMP 的区别?
  25. MySQL 如何做备份和恢复?

总结

如果你是为了以后工作,MySQL 最核心的学习路线是:

text 复制代码
SQL 基础
  ↓
表设计
  ↓
索引
  ↓
执行计划
  ↓
事务
  ↓
锁
  ↓
MVCC
  ↓
慢 SQL 优化
  ↓
备份恢复
  ↓
主从复制
  ↓
高可用与分库分表

其中最重要的是:

  1. SQL 查询能力
  2. 表结构设计能力
  3. 索引设计能力
  4. 慢 SQL 分析能力
  5. 事务和锁的理解能力

这几部分掌握好,基本就能满足大部分后端开发岗位的 MySQL 要求。

相关推荐
吃好睡好便好2 小时前
用if…end…语句计算分段函数
开发语言·人工智能·学习·算法·matlab
爱睡懒觉的焦糖玛奇朵2 小时前
【从视频到数据集:焦糖玛奇朵的魔法工具Video To YOLO Dataset】
人工智能·python·学习·yolo·音视频
Dust-Chasing3 小时前
Claude Code源码剖析 - Phase3
开发语言·人工智能·学习
振浩微433射频芯片4 小时前
告别“喊破嗓”:深度解析433MHz射频在宠物训练器中的核心应用与选型
单片机·嵌入式硬件·物联网·学习·宠物
知识分享小能手4 小时前
Flask入门学习教程,从入门到精通, Flask模板 — 完整知识点与案例代码 (2)
python·学习·flask
humors2214 小时前
突破学习瓶颈:十个需要克服的障碍
大数据·学习·程序人生
GEO从入门到精通4 小时前
在哪里能买到GEO学习工具或课程?
人工智能·学习
心中有国也有家4 小时前
从零上手 CANN 学习中心:像逛技术便利店一样学昇腾
学习·算法·开源
¿i?5 小时前
对多元微积分的简单理解
学习