MySQL开发规范由基础规范、命名规范、字段规范、索引规范、语句规范组成。
1、基础规范
(1)所有表统一使用InnoDB存储引擎。
(2)表字符集选择UTF8mb4。
(3)所有表和列都需要添加注释。
(4)禁止在数据库中存储明文密码。
(5)禁止客户端直接操作数据库。
(6)禁止在线上数据库做压力测试。
(7)表结构更新,研发必须提供更新文档(包含更新语句和回滚语句)。
(8)表结构更新,DBA审核未通过的,不允许上线。
2、命名规范
(1)库名、表名、字段名必须使用小写字母加下划线的命名方式。
(2)库名、表名、字段名字符数不易太长但必须见名知意。
(3)库名、表名、字段名禁止使用MySQL保留字。
(4)临时库、表名必须以tmp为前缀,并以日期为后缀。
(5)备份库、表名必须以bak为前缀,并以日期为后缀。
3、字段规范
(1)每张表必须有整型主键。
(2)禁止DEFAULT NULL,建议NOT NULL,设置默认值。
(3)存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE,或者使用BIGINT(需要做转换)。
(4)建议使用UNSIGNED存储非负数值。
(5)不建议使用ENUM类型,使用TINYINT类型来代替。
(6)存储状态,性别等选择性低的字段,用TINYINT类型。
(7)尽可能不使用TEXT、BLOB类型。如果必须使用,要拆分到单独的表中存储。
(8)需要根据实际的宽度来选择VARCHAR(N)类型的宽度。
(9)存储年使用YEAR类型,存储日期使用DATE类型。
(10)存储时间(精确到秒)建议使用TIMESTAMP类型,因为TIMESTAMP使用4字节,DATETIME使用8个字节。TIMESTAMP类型保存的值不能比1970早或比2037晚。
4、索引规范
(1)单张表的索引数量控制在5个以内。
(2)组合索引中的字段数建议不超过5个。
(3)不使用更新频繁的列做为索引。
(4)对长字符串考虑使用前缀索引,前缀索引长度不超过8个字符。
(5)使用EXPLAIN判断SQL语句是否合理使用索引,尽量避免extra列出现:Using File Sort,Using Temporary。
(6)UPDATE、DELETE语句需要根据WHERE条件添加索引。
(7)合理创建组合索引,(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c),但(a,c)只能用到部分索引。
(8)不在选择性低的列上建立索引,例如"性别","状态", "类型"。
(9)高并发场景不建议使用唯一索引。
5、语句规范
(1)SQL语句中IN包含的值不应过多(不超过1000个)
(2)UPDATE、DELETE语句不使用LIMIT。
(3)WHERE条件中必须使用合适的类型,避免MySQL进行隐式类型转化而使用不到索引。
(4)SELECT、INSERT语句必须显式的指明字段名称。
(5)WHERE条件中的非等值条件(IN、BETWEEN、<、<=、>、>=)会导致后面的条件使用不了索引,尽量放在最后。
(6)INSERT语句使用多值提交,values的个数不应过多。
(7)避免使用存储过程、触发器、函数、数学运算、外键等,容易将业务逻辑和DB耦合在一起。
(8)尽量避免使用JOIN。
(9)使用合理的SQL语句减少与数据库的交互次数。
(10)不使用ORDER BY RAND(),使用其他方法替换。
(11)建议使用合理的分页方式以提高分页的效率。
(12)不使用前导查询,如like "%ab",like "%ab%"。
(13)用or分割开的条件,or两边的字段都要创建索引。