一、基础与架构

1. MySQL 逻辑架构

客户端 → 连接器 → 查询缓存(8.0移除) → 分析器 → 优化器 → 执行器 → 存储引擎

2. 存储引擎对比

特性

InnoDB

MyISAM

事务

支持

不支持

锁粒度

行级锁

表级锁

外键

支持

不支持

缓存

数据+索引

仅索引

主键

必须有

可以没有

崩溃恢复

支持

较差

应用场景

OLTP

OLAP/只读

二、索引

1. 索引类型

  • B+Tree索引:默认索引,适用于范围查询

  • Hash索引:Memory引擎,等值查询快

  • 全文索引:MyISAM/InnoDB,全文搜索

  • 空间索引:MyISAM,地理数据

2. B+Tree vs B-Tree

B+Tree:
- 非叶子节点只存key,不存data
- 叶子节点双向链表连接
- 所有数据在叶子节点
- 更适合范围查询

3. 聚簇索引 vs 非聚簇索引

-- 聚簇索引:InnoDB,数据与索引一起存储
-- 非聚簇索引:MyISAM,数据与索引分开存储
-- 回表查询:先查二级索引,再查主键索引

4. 索引优化原则

  • 最左前缀原则

  • 避免在索引列上做计算、函数、类型转换

  • 尽量使用覆盖索引

  • 字符串前缀索引

  • 索引下推(5.6+)

三、事务

1. ACID 特性

  • Atomicity:原子性,undo log保证

  • Consistency:一致性,其他三者保证

  • Isolation:隔离性,锁/MVCC保证

  • Durability:持久性,redo log保证

2. 事务隔离级别

-- 查看:SELECT @@tx_isolation;
-- 设置:SET SESSION TRANSACTION ISOLATION LEVEL ...;

级别

脏读

不可重复读

幻读

实现方式

READ UNCOMMITTED

无锁

READ COMMITTED

行锁,无间隙锁

REPEATABLE READ

MVCC+间隙锁

SERIALIZABLE

全表锁

3. MVCC 多版本并发控制

-- 每行数据有隐藏字段:
-- DB_TRX_ID:最后修改事务ID
-- DB_ROLL_PTR:回滚指针
-- DB_ROW_ID:行ID
-- 通过ReadView实现一致性视图

四、锁机制

1. 锁类型

-- 行级锁
S锁(共享锁):SELECT ... LOCK IN SHARE MODE
X锁(排他锁):SELECT ... FOR UPDATE

-- 表级锁
LOCK TABLES ... READ/WRITE

2. 锁算法

  • Record Lock:记录锁,锁单行

  • Gap Lock:间隙锁,锁范围,防止幻读

  • Next-Key Lock:记录锁+间隙锁

3. 死锁处理

-- 查看:SHOW ENGINE INNODB STATUS\G
-- 默认策略:等待超时或最小代价回滚

五、SQL 优化

1. EXPLAIN 分析

EXPLAIN SELECT * FROM users WHERE age > 20;

关键字段:

  • type:ALL < index < range < ref < eq_ref < const

  • key:实际使用的索引

  • rows:预估扫描行数

  • Extra:Using index(覆盖索引), Using filesort, Using temporary

2. 优化建议

  • 避免 SELECT *

  • 合理使用索引

  • 避免大事务

  • 分页优化

  • 避免 NULL 值

  • 批量操作

3. 慢查询分析

-- 开启慢查询日志
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 2;

-- 分析工具
mysqldumpslow
pt-query-digest

六、存储与备份

1. 日志文件

  • 错误日志:error.log

  • 二进制日志:binlog,主从复制/数据恢复

  • 查询日志:general.log

  • 慢查询日志:slow-query.log

  • 中继日志:relay.log,从库使用

  • 重做日志:redo log,崩溃恢复

  • 回滚日志:undo log,事务回滚

2. 备份策略

# 物理备份
mysqldump -u root -p dbname > backup.sql

# 物理备份
xtrabackup --backup --target-dir=/backup/

# 恢复
mysql -u root -p dbname < backup.sql

七、主从复制

1. 复制原理

主库:写操作 → binlog → dump线程 → 网络
从库:IO线程 → relay log → SQL线程 → 应用日志

2. 复制模式

  • 异步复制(默认)

  • 半同步复制

  • 全同步复制

  • 组复制(MGR)

3. 搭建步骤

-- 主库配置
server-id=1
log-bin=mysql-bin
sync_binlog=1

-- 从库配置
server-id=2
relay-log=mysql-relay-bin
read-only=1

八、分库分表

1. 拆分策略

  • 垂直拆分:按业务分库

  • 水平拆分:按规则分表

  • 常见路由:取模、范围、哈希、一致性哈希

2. 分页问题

-- 全局分页:汇总各分表结果
-- 建议:业务层避免深分页

3. 分布式ID

  • UUID

  • 雪花算法

  • 数据库自增(步长区分)

  • Redis/MongoDB生成

九、高可用

1. 主从切换

  • 手动切换

  • MHA(Master High Availability)

  • Orchestrator

2. 读写分离

  • 应用层实现

  • 中间件:MyCat、ShardingSphere

  • Proxy:MySQL Router、ProxySQL

3. 集群方案

  • 主从复制

  • MGR(MySQL Group Replication)

  • Galera Cluster

  • NDB Cluster

十、性能调优

1. 参数调优

# 连接相关
max_connections = 1000
thread_cache_size = 64

# 缓冲池
innodb_buffer_pool_size = 总内存的70-80%
innodb_log_file_size = 1-2G
innodb_flush_log_at_trx_commit = 1/2

# 查询缓存(5.7有,8.0移除)
query_cache_size = 0
query_cache_type = 0

2. 硬件优化

  • SSD硬盘

  • 足够内存

  • CPU多核

  • RAID配置

十一、常见问题

1. COUNT() vs COUNT(1) vs COUNT(列)*

-- 效率:COUNT(*) ≈ COUNT(1) > COUNT(列)
-- COUNT(列) 会排除NULL值

2. CHAR vs VARCHAR

  • CHAR:定长,存储快

  • VARCHAR:变长,节省空间

  • 建议:长度固定用CHAR,否则用VARCHAR

3. JOIN 优化

-- 驱动表选择:小表驱动大表
-- 避免笛卡尔积
-- 使用索引

4. 大表优化

-- 历史数据归档
-- 分区表
-- 垂直拆分
-- 读写分离

十二、MySQL 8.0 新特性

1. 新功能

  • 窗口函数

  • 通用表表达式(CTE)

  • 不可见索引

  • 降序索引

  • 原子DDL

  • JSON增强

2. 性能提升

  • 直方图统计信息

  • 资源组

  • 并行查询

  • 临时表性能改进

十三、实战案例

1. 索引失效场景

-- 1. 隐式类型转换
WHERE phone = 13800138000  -- phone是varchar

-- 2. 对索引列做运算
WHERE YEAR(create_time) = 2024

-- 3. 使用函数
WHERE LEFT(name, 3) = 'abc'

-- 4. 模糊查询前缀
WHERE name LIKE '%abc%'

2. 死锁分析

-- 场景:事务A先删后插,事务B先插后删
-- 解决:统一操作顺序

3. 分页优化

-- 低效:
SELECT * FROM table LIMIT 1000000, 20;

-- 优化1:记录上次最大ID
SELECT * FROM table WHERE id > 1000000 LIMIT 20;

-- 优化2:JOIN优化
SELECT * FROM table a
JOIN (SELECT id FROM table LIMIT 1000000, 20) b
ON a.id = b.id;

面试准备建议

  1. 掌握底层原理(索引、事务、锁)

  2. 熟练使用EXPLAIN分析SQL

  3. 了解生产环境调优经验

  4. 准备实际案例和解决方案

  5. 关注MySQL 8.0+新特性

  6. 了解分布式架构方案

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐