Home / cs-notes / Books / Java / 阿里Java开发手册 / v2022.02.03 / Note / 注意 / 05. MYSQL 规约
MYSQL 规约
建表规约
- bool 字段
- is_xxx
- tinyint
- 1=true, 0=false
-
表名不用复数
- 主键索引 pk_
- 唯一索引 uk_
- 普通索引 idx_
- 小数类型 decimal, 禁用 float / double
- 如果超出范围, 分为整数, 小数 两部分
- varchar 长度不要超过 5000
- 否则用 text, 单独建表
- 必备字段
- id
- bigint unsigned
- 自增, 步长=1
- create_time: datetime / timestamp
- update_time: datetime / timestamp
- id
-
用逻辑删除, 而非物理删除
- 单表超过 500w 行, 或 2GB 才推荐分库分表
索引规约
- 唯一性字段必用 唯一索引
- 避免脏数据
- 提高查询效率
-
超过3张表禁止 join, 关联字段必索引
-
varchar 指定索引长度
-
禁止左模糊, 或全模糊
-
注意索引的有序性
-
尽可能避免回表
- 超多分页优化
- 延迟关联
- 子查询
- sql 优化目标
- range 级别
- ref 级别
- const 级别
- 避免隐式类型转换, 导致索引失效
SQL 语句
-
count 与 NULL
-
ISNULL()
-
count=0 时直接返回, 避免继续分页查询
- 不用外键及级联
- 外键: 影响插入速度
- 级联: 可能引起更新风暴
- 解决: 应用层解决
- 禁用存储过程
- 难以调试、扩展、移植
-
更新前先查询
-
多表查询, 须用表名限定列名, 避免多表存在相同列名
-
尽量避免 in 操作
- 国际化 - utf8mb4
- LENGTH
- CHARACTER_LENGTH
- TRUNCATE vs DELETE
ORM
-
查列不用 *
- 使用 resultMap 而非 resultClass
- 将 DO 与 表字段 解耦
-
只更新需要更新的字段, 而非所有列
- 事务
- 性能考量
- 回滚方案