此处列出互联网公司常用的MySQL DBA规范,仅供参考。

部署规范

1. DB集群的架构:一主多从,读写分离
2. 主库功能:承载DDL(CREATE、ALTER、DROP等)、DML (SELECT、UPDATE、INSERT、DELETE)、查询操作,并且通过Binlog将所有操作在从库上复现,从而实现主从数据一致
3. 线上从库功能:承载线上查询(select)操作,以减轻主库压力
4. 线下从库功能:供开发进行相关查询操作,以避免慢查询影响线上业务
5. 严禁在从库上进行增、删、改操作,以避免主从数据不一致,导致同步断开
6. 线上数据库严禁delete不加where条件 (delete from table),如遇需要清除大表的需求,需要联系DBA同事进行处理
7. 一般来说禁止在线上数据库做压力测试
8. 禁止从测试、开发环境直连线上数据库

建表规范

1. 建表语句必须在sql审核平台(公司内部提供)审核通过,不然不予以创建
2. MySQL引擎默认使用InnoDB,使用其他引擎需要特别说明
3. 表名命名前缀要符合公司要求,字母小写,后面跟业务名称用 “_” 连接,长度不超过30个字符,且见名知意
4. 字符集使用utf8mb4,排序规则使用utf8mb4_general_ci
5. `id` int(11) NOT NULL AUTO_INCREMENT 作为第一个字段,且为主键,有自增属性
6. 各个类型字段均有NOT NULL属性,有默认值,不使用保留字,必须有中文说明
7. 时间类型字段的默认值遵循此类型的范围,推荐用timestamp
8. 尽可能不要使用text,blob类型,如果必须使用,不要设置not null类型
9. 不要在数据库中使用varbinary或blob存储图片及文件,mysql并不适合大量存储这类型文件
10. 表注释部分要说明此表的作用
11. 如果使用分表,表名内有明确的标识作为后缀
12. 不使用外键,触发器,函数,存储过程,事件
13. 单表建议控制在5000万以内
14. 普通索引命名规则: idx_索引名称 例:KEY `idx_school_name` (`school_name`)
15. 唯一索引命名规则: uniq_索引名称 例:UNIQUE KEY `uniq_serial` (`serial`)
16. 不要使用char类型,以varchar代替
17. 数据库名和表名根据操作系统不同是大小写敏感的,字段名是非敏感的,建议小写并用下划线分隔
18. 使用DECIMAL代替FLOAT和DOUBLE存储精确浮点数
19. 禁止在数据库中存储明文密码,需把密码加密后存储
20. 存储IP最好用int存储而非char(15)

索引规范

1. 单张表的索引数量不超过5个
2. 复合索引字段数不超过5个
3. 对⻓字符串使用前缀索引,前缀⻓度不超过8个字符
4. 对特殊字段,增加crc32或md5的伪列并建立索引
5. 尽量复用联合索引,避免冗余索引
6. 不在低基数列上建立索引,例如“性别”
7. UPDATE,DELETE语句的WHERE条件列必须使用索引

查询规范

1. 不使用%前导的查询,尽量优化负向查询,此类查询不能使用索引,例如like “%abc”, not in,!= ,not like, <>
2. SQL的返回结果尽量少,合理使用分⻚展示
3. 注意字段的类型,避免隐式转换即字符型字段的值需要加单引号,数值型不加
4. 避免使用大表的JOIN,将大SQL拆分成小SQL。OLTP(On-Line Transaction Processing,联机事务处理)类型SQL建议优化到0.05秒以内,OLAP(On-Line Analytical Processing,联机分析处理)类型在从库查询,查询最大时间为600秒
5. 避免在数据库中进行数学运算
6. 减少与数据库的交互次数,插入、更新或删除大量数据时,一次操作10000行数据以内,循环执行有一秒的间隔
7. 不在业务高峰期批量更新、批量删除
8. 禁止联库查询
9. 不要用select *,查询哪几个字段就select哪几个字段
10. sql中使用到OR的改写为用IN() (or的效率没有in的效率高)
11. in里面数字的个数建议控制在1000以内
12. 不使用负向查询,如not in/like,not in会把空和NULL也给查出来。