我的微信号:cyberdak ,欢迎加我交流
基础规范
-
数据库引擎只允许使用 InnoDB
-
数据库字符集默认使用utf8md4. 该字符串兼容utf8,支持存储 emoji 表情。
现在emoji表情真的非常流行
- 禁止在数据库中存储文件、图片等大二进制数据
文件、图片等数据,使用对象存储系统存储,比如阿里云的oss服务
-
禁止使用外键、存储过程、触发器、视图
-
禁止在线上环境做压测
线上环境压测,出问题就该跑路了
命名规范
- 库名、表名、列名必须使用小写+下划线分割方式
- 库名、表名、列名必须所见即所得,含义明确
- 从库以
-s
结尾 - 备份库以
-bak
结尾
表设计规范
- 禁止使用外键
如果业务上有完整性要求,那么使用程序保证。外键会使表之间耦合,影响update/delete的性能。
- 表必须有主键,推荐使用UNSIGNED整数为主键
列设计规范
- 永远使用正确的数据类型
能用int存储的就不用varchar;用long来存储ip,而不是varchar;使用datetime而不是varchar(20)来保存时间
- 使用char(1)取代varchar(1)
如果只存储一个字符,就使用char(1),varchar 会占用额外的空间
- 仅使用char来存储固定长度的字段
如果字段长度小于1000,使用char(1000)会比varchar(1000)浪费更多资源
-
酌情使用 tinyint / int / bigint ,数据范围为0 到255 / -2^31 (-2,147,483,648) 到2^31 - 1 (2,147,483,647) / -2^63 (-9223372036854775808) 到2^63-1 (9223372036854775807),占用大小为1/4/8字节
-
所有列都定义为NOT NULL并且设置默认值
-
使用varchar(20)存储手机号,而且不是用int
varchar 可以模糊查询;手机号不会做运算;手机号会比11位长,比如+86-1xxxxxxxxxx
索引规范
- 唯一索引以
uniq_${字段名}
来命名 - 非唯一索引以
idx_${字段名}
来命名 - 索引复合最左前缀规范,提高索引使用度
SQL优化
- 养成使用
explain
的好习惯
explain 是MySQL语句的分析和诊断工具,只有基于诊断数据才能真正做优化,否则就是无头苍蝇
。
- 禁止使用select * ,只获取需要使用的字段
查询额外的字段会导致额外的查询、传输成本,并且在某些场景会导致额外的回表操作
- 大数据量禁止使用limit + offset 做分页
limit + offset 是深度分页,会获取所有数据,然后丢弃不需要的数据,效率非常低。使用id辅助分页是合理的做法.
- 永远不要查询字段上使用函数
这会导致无法使用索引,退化为全表扫描,效率非常差。
反例:SELECT columns FROM table WHERE left (customer_code,2)=’AK’
,正例:SELECT columns FROM table WHERE customer_code like ‘AK%’
- 隐式类型转换会导致索引失效,导致全表扫描,使用正确的数据类型查询。
如age 字段是int类型,使用sql :select name from table where age ="32" 就无法使用索引。
安全
- 不要在公网上暴露MySQL
有很多黑客会7*24扫描网络上的服务,你的MySQL随时会被攻击
- 使用一个复杂的root账号密码
理由同上,随机会被攻击,还有弱口令攻击,一旦攻击者获取
root权限,后果不敢设想
- 为每一个数据库设定单独的账号密码
做到最小权限、权限分离,一个账号丢失、泄漏最多只会影响一个数据库