5-3 MySQL数据库开发的36条军规
TIPS
本文转载自互联网,原作者是赶集网石展。这36条军规,大目于2014年前后接触,之后就一直遵循。里面的内容个人深度认同。强烈建议大家遵守。
此外:
这36条军规配套的PDF(描述得更加详细,强烈建议下载),下载地址:
地址1: https://git.imooc.com/class-73/Architect-Stage-6-Optimize/src/master/%e6%95%b0%e6%8d%ae%e5%ba%93%e8%b0%83%e4%bc%98%e7%9b%b8%e5%85%b3%e6%9d%90%e6%96%99/MySQL%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bc%80%e5%8f%91%e7%9a%84%e4%b8%89%e5%8d%81%e5%85%ad%e6%9d%a1%e5%86%9b%e8%a7%84_%e7%9f%b3%e5%b1%95_%e5%ae%8c%e6%95%b4.pdf 地址2:链接:https://pan.baidu.com/s/1T_l50I-iLwaFTFzNwUq11Q 密码:da5b
核心军规
- 尽量不在数据库做运算
- 控制单表数据量 纯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