
核心军规
- 尽可能不在数据库作运算
- 控制单表数据量 纯INT不超过10M条,含Char不超过5M条
- 保持表身段苗条
- 平衡范式和冗余
- 拒绝大SQL,复琐事务,大批量任务
字段类军规
- 用好数值字段,尽可能简化字段位数
- 把字符转化为数字
- 优先使用Enum或Set
- 避免使用Null字段
- 少用并拆封Text/Blob
- 不在数据库中存图片
索引类军规
- 谨慎合理添加索引
- 字符字段必须创建前缀索引?
- 不在索引列作运算
- 自增列或全局ID作InnoDB主键
- 尽可能不用外键
SQL类军规
- SQL尽量简单
- 保持事务链接短小
- 尽量避免使用SP/Trigger/Function
- 尽可能不用Select *
- 改写Or为IN()
- 改写Or为Union
- 避免负向查询和%前缀模糊查询
- Count不要使用在可Null的字段上面
- 减小Count(*)
- Limit高效分页,SELECT * FROM message WHERE id > 9527 (or sub select) limit 10
- 使用Union ALL 而不用Union
- 分解连接,保证高并发
- Group By 去除排序
- 同数据类型的列值比较
- Load Data导入数据,比Insert快20倍
- 打散大批量更新,尽可能凌晨操做
约定类军规
- 隔离线上线下
- 禁止未经DBA认证的子查询
- 永远不在程序段显式加锁
- 表字符集统一使用UTF8MB4
统一使用UTF8MB4 for by 可能还有人不知道,MySQL 数据库的字符集,要用 utf8mb4,而不是utf8。由于MySQL的utf8不是真正的UTF-8,只支持最多三个字节的字符。真正的UTF-8可能会出现四个字节的字符。MySQL 历来没有修复这个 Bug,而是使用另外的解决方法:真正的UTF-8字符集用 utf8mb4的名字提供。sql