Skip to content

数据库设计与优化

1. 数据库三范式 (Normalization)

  1. 第一范式 (1NF):每一列都是不可分割的原子项(字段不可再分)。
  2. 第二范式 (2NF):在 1NF 基础上,非主键列必须完全依赖于主键(消除部分依赖)。
  3. 第三范式 (3NF):在 2NF 基础上,非主键列必须直接依赖于主键(消除传递依赖)。

反范式化 (Denormalization):在追求查询性能的场景下,为了减少 JOIN 操作,适当增加数据冗余(如冗余存储统计字段)。


2. 数据库设计原则

  1. 选择合适的数据类型
    • 优先选择占用空间小的数据类型(如 INT vs BIGINT)。
    • 固定长度字段优先于可变长度字段(如 CHAR vs VARCHAR)。
    • 精确计算使用 DECIMAL 而非 FLOAT/DOUBLE
  2. 字段尽量设置为 NOT NULL
    • NULL 值占用额外空间。
    • 索引中包含 NULL 值会使索引扫描变复杂。
  3. 统一字段命名规范
    • 蛇形命名(user_id),小写,意义明确。

3. 分库分表 (Sharding)

垂直拆分 (Vertical)

  • 垂直分库:按业务模块拆分,如 user_db, order_db
  • 垂直分表:按列拆分,将大字段或不常用字段拆分到新表。

水平拆分 (Horizontal)

  • 水平分表:将单表数据按某种算法(如 ID 取模、按时间、按地理位置)拆分到多个表中。
  • 水平分库:将数据分布到不同物理节点。

4. SQL 慢查询分析与优化

  1. 定位慢查询
    • 开启慢查询日志 (slow_query_log)。
    • 设置慢查询阈值 (long_query_time)。
  2. 使用 EXPLAIN 分析查询执行计划(见 MySQL 核心面试题)。
  3. 常见优化方案
    • 避免 SELECT *:只查询需要的列(减少回表,支持覆盖索引)。
    • 优化 ORDER BYGROUP BY:尽量利用索引排序,避免 Using filesort
    • 使用 UNION ALL 代替 UNION:如果确定数据不重复,UNION ALL 不需要去重,效率更高。
    • 大分页查询优化:使用 LIMIT offset, size 时,如果 offset 很大,性能会骤降。可以通过索引覆盖+关联查询优化,或者记录上一次查询的最大 ID。

5. 主从复制与读写分离

  • 原理:Master 节点将变更写入 Binlog,Slave 节点通过 Relay Log 同步数据。
  • 应用
    • 读写分离:写操作到 Master,读操作到 Slave,极大提升系统吞吐量。
    • 数据备份:Slave 作为 Master 的热备份。
  • 一致性问题:由于异步复制存在延迟,Slave 读到的数据可能不是最新的。可以通过“同步写异步读”策略或特定强一致性方案解决。
最近更新