基础:
- InnoDB,utf8
- 禁止使用存储过程,视图,触发器,Event
- 禁止在数据库中存储大文件,例如照片,可以将大文件存储在对象存储系统,数据库中存储路径
- 禁止在线上环境做数据库压力测试
- 测试,开发,线上数据库环境必须隔离
规范:
-
表必须有主键,推荐使用
UNSIGNED
整数为主键,删除无主键的表,如果是row
模式的主从架构,从库会挂住 -
禁止使用外键,如果要保证完整性,应由应用程式实现,外键使得表之间相互耦合,影响
update/delete
等 SQL 性能,有可能造成死锁,高并发情况下容易成为数据库瓶颈 -
字段定义为
NOT NULL
并设默认值,NULL 的列使用索引,索引统计,值都更加复杂,MySQL 更难优化,NULL 需要更多的存储空间,NULL 只能采用IS NULL
或者IS NOT NULL
,而在=/!=/in/not in
时有大坑 - 使用
INT UNSIGNED
存储IPv4
,不要用char(15)
- 使用
TINYINT
来代替ENUM
,ENUM
增加新值要进行DDL
操作
索引规范:
- 唯一索引使用
uniq_[字段名]
来命名 - 非唯一索引使用
idx_[字段名]
来命名 - 非必要不要进行
JOIN
查询,如果要进行JOIN
查询,被JOIN
的字段必须类型相同,并建立索引,踩过因为JOIN
字段类型不一致,而导致全表扫描的坑么? - 理解组合索引最左前缀原则,避免重复建设索引,如果建立了(a,b,c),相当于建立了(a), (a,b), (a,b,c)
sql规范:
- 禁止
select *
- 禁止在
where
条件列使用函数或者表达式 - 禁止负向查询以及
%
开头的模糊查询 - 隐式类型转换会使索引失效,导致全表扫描
- 禁止大表
JOIN
和子查询 - 同一个字段上的
OR
必须改写问IN
,IN
的值必须少于 50 个 - 应用程序必须捕获 SQL 异常