命名规范
- 库名、表名、字段名采用26个英文字母和0-9这十个数字,加上下划线'_'组成,不能出现其他字符(注释除外).
- 库名、表名、字段名禁止超过30个字符。
- 库名、表名、字段名禁止使用MySQL保留字
- 数据对象、变量的命名都采用英文字符,禁止使用中文命名.
- 临时库、表名必须以tmp为前缀,并以日期为后缀. 如tmp_tablea_20151130
- 备份库、表必须以bak为前缀,并以日期为后缀。如bak_Databasename_20151130
基础规范
- MySQL5.6版本建议使用INNODB存储引擎
- 表字符集使用UTF8,需要支持emoji 表情的列设置为utf8mb4
- 所有表和列原则上都需要添加注释
- 单表数据量建议控制在100万-1000W以内,或不超过10G
- 不在数据库中存储图片、文件.
- 禁止在线上做数据库压力测试,如有特殊需要,需提前报备。
- 禁止客户端直接操作测试,生产数据库
字段设计规范:
- 尽可减少使用TEXT、BLOB类型。如必要需将TEXT,BLOB字段拆分后单独存储。
- 不建议使用FLOAT和DOUBLE,建议用DECIMAL或bigint替代。
- 不建议使用ENUM类型,考虑TINYINT代替。
- 原则上禁止DEFAULT NULL,建议NOT NULL 设置默认值。
- 如果不存储负数,建议使用UNSIGNED存储非负整数
- 使用bigint存储时间
- 使用INT UNSIGNED存储IPV4
- InnoDB引擎优先考虑使用VARBINARY存储大小写敏感的变长字符串
- 禁止在数据库中存储明文密码
索引规范
- 单张表中索引数量不超过5个
- 单个复合索引中的字段数不超过5个
- 对字符串使用前缀索引,前缀索引长度不超过8个字符。
- 建议优先考虑前缀索引,必要时可添加伪列并建立索引。
- InnoDB表必须有主键,即使主键是无意义的。
- 不使用更新频繁的列做为索引。
- 频繁执行的重要SQL必须被索引
- UPDATE、DELETE语句的WHERE条件列,ORDER BY、GROUP BY、DISTINCT的字段,多表JOIN的字段 建议设置索引
- 选择度最大的字段放在前面
- 核心SQL优先考虑覆盖索引
- 避免冗余和重复索引
索引禁忌
- 不在选择性低的列上建立索引,例如“性别”, “状态”, “类型”
- 不在索引列进行数学运算和函数运算
- 尽量不使用外键
- 不使用前导查询,如like “%ab”,like “%ab%”
对于使用%ab%的语句,一是改写SQL;二是通过redis先读到内存,然后在读取操作(第一次读取比较慢);三是通过Elasticsearch解决。根据业务取适中方案即可。
SQL设计
- 要求所有的SQL提交测试前,使用EXPLAIN 查看执行计划 ,避免全表扫描,避免生成临时表
- 使用预编译语句. 高效,相对安全。
- 禁止不同类型字段做比较,避免隐式转换
- 尽量不使用存储过程、触发器、UDF、events等
- 避免使用大表的JOIN
- 避免在数据库中进行数学运算,尽量在程序端做处理,传给数据库。
- 尽量将大SQL拆分成小SQL
- 禁止单条SQL语句同时更新多个表
- 禁用select *
- Insert 语句必须显示指定字段名
操作规范:
- 批量导入、导出数据必须提前通知DBA协助观察.
- 禁止在线上从库执行后台管理和统计类查询。尽量放在备份库操作.
- 最小化权限原则。只分配应用必要的权限。Delete权限需按表分配.
- 尽量不在MySQL数据库中存放业务逻辑.
- 重大项目的数据库方案选型和设计提前通知DBA参与.
- 大型推广活动或上线新功能须提前通知DBA进行评估.
- 对特别重要的库表,提前与DBA沟通确定维护和备份优先级.
- 避开在业务高峰期批量更新、查询数据库.
- 线上数据变更,须详细注明所有相关SQL语句.
线上数据变更:要创建task,并邮件给DBA。
注意事项:
1 。需要建库的应用,需要提供应用的IP,以便对数据库用户进行授权。
2. MySQL线上环境涉及到数据库的DDL(Create,Alter,Drop,DECLARE)操作由DBA审核后操作。