Skip to the content.

Home / cs-notes / Books / Java / 阿里Java开发手册 / v2022.02.03 / Note / 注意 / 05. MYSQL 规约

MYSQL 规约

建表规约

  1. bool 字段
    • is_xxx
    • tinyint
    • 1=true, 0=false
  2. 表名不用复数

  3. 主键索引 pk_
    • 唯一索引 uk_
    • 普通索引 idx_
  4. 小数类型 decimal, 禁用 float / double
    • 如果超出范围, 分为整数, 小数 两部分
  5. varchar 长度不要超过 5000
    • 否则用 text, 单独建表
  6. 必备字段
    • id
      • bigint unsigned
      • 自增, 步长=1
    • create_time: datetime / timestamp
    • update_time: datetime / timestamp
  7. 用逻辑删除, 而非物理删除

  8. 单表超过 500w 行, 或 2GB 才推荐分库分表

索引规约

  1. 唯一性字段必用 唯一索引
    • 避免脏数据
    • 提高查询效率
  2. 超过3张表禁止 join, 关联字段必索引

  3. varchar 指定索引长度

  4. 禁止左模糊, 或全模糊

  5. 注意索引的有序性

  6. 尽可能避免回表

  7. 超多分页优化
    • 延迟关联
    • 子查询
  8. sql 优化目标
    • range 级别
    • ref 级别
    • const 级别
  9. 避免隐式类型转换, 导致索引失效

SQL 语句

  1. count 与 NULL

  2. ISNULL()

  3. count=0 时直接返回, 避免继续分页查询

  4. 不用外键及级联
    • 外键: 影响插入速度
    • 级联: 可能引起更新风暴
    • 解决: 应用层解决
  5. 禁用存储过程
    • 难以调试、扩展、移植
  6. 更新前先查询

  7. 多表查询, 须用表名限定列名, 避免多表存在相同列名

  8. 尽量避免 in 操作

  9. 国际化 - utf8mb4
    • LENGTH
    • CHARACTER_LENGTH
  10. TRUNCATE vs DELETE

ORM

  1. 查列不用 *

  2. 使用 resultMap 而非 resultClass
    • 将 DO 与 表字段 解耦
  3. 只更新需要更新的字段, 而非所有列

  4. 事务
    • 性能考量
    • 回滚方案