数据库设计与优化
1. 数据库三范式 (Normalization)
- 第一范式 (1NF):每一列都是不可分割的原子项(字段不可再分)。
- 第二范式 (2NF):在 1NF 基础上,非主键列必须完全依赖于主键(消除部分依赖)。
- 第三范式 (3NF):在 2NF 基础上,非主键列必须直接依赖于主键(消除传递依赖)。
反范式化 (Denormalization):在追求查询性能的场景下,为了减少 JOIN 操作,适当增加数据冗余(如冗余存储统计字段)。
2. 数据库设计原则
- 选择合适的数据类型:
- 优先选择占用空间小的数据类型(如
INTvsBIGINT)。 - 固定长度字段优先于可变长度字段(如
CHARvsVARCHAR)。 - 精确计算使用
DECIMAL而非FLOAT/DOUBLE。
- 优先选择占用空间小的数据类型(如
- 字段尽量设置为
NOT NULL:NULL值占用额外空间。- 索引中包含
NULL值会使索引扫描变复杂。
- 统一字段命名规范:
- 蛇形命名(
user_id),小写,意义明确。
- 蛇形命名(
3. 分库分表 (Sharding)
垂直拆分 (Vertical)
- 垂直分库:按业务模块拆分,如
user_db,order_db。 - 垂直分表:按列拆分,将大字段或不常用字段拆分到新表。
水平拆分 (Horizontal)
- 水平分表:将单表数据按某种算法(如 ID 取模、按时间、按地理位置)拆分到多个表中。
- 水平分库:将数据分布到不同物理节点。
4. SQL 慢查询分析与优化
- 定位慢查询:
- 开启慢查询日志 (
slow_query_log)。 - 设置慢查询阈值 (
long_query_time)。
- 开启慢查询日志 (
- 使用 EXPLAIN 分析查询执行计划(见 MySQL 核心面试题)。
- 常见优化方案:
- 避免
SELECT *:只查询需要的列(减少回表,支持覆盖索引)。 - 优化
ORDER BY和GROUP BY:尽量利用索引排序,避免Using filesort。 - 使用
UNION ALL代替UNION:如果确定数据不重复,UNION ALL不需要去重,效率更高。 - 大分页查询优化:使用
LIMIT offset, size时,如果offset很大,性能会骤降。可以通过索引覆盖+关联查询优化,或者记录上一次查询的最大 ID。
- 避免
5. 主从复制与读写分离
- 原理:Master 节点将变更写入 Binlog,Slave 节点通过 Relay Log 同步数据。
- 应用:
- 读写分离:写操作到 Master,读操作到 Slave,极大提升系统吞吐量。
- 数据备份:Slave 作为 Master 的热备份。
- 一致性问题:由于异步复制存在延迟,Slave 读到的数据可能不是最新的。可以通过“同步写异步读”策略或特定强一致性方案解决。