MySQL 使用规范
以下规范适用在线交易(OLTP)系统的数据库。数据仓库与分析系统也可以参考。
命名规范
表名、字段名、索引名使用小写字母、数字,采用下划线分割
表名采用模块名3个缩小字符_前缀,之后顺序为表名,最后_分表后缀
表名、字段名不超过 32 个字符
存储实体数据的表,名称使用名词,单数
索引名称采用 idx_ 前缀,之后顺序跟随索引的字段名,字段名直接以下划线分割
不使用保留字
存储实体表间多对多对应关系的表,名称建议采用 noun_verb_noun 这样的模式。例如: member_like_property、property_has_tag。
SQL 语句中,
保留字使用全大写
字符串使用单引号(')
sql
-- 正确
SELECT id, title FROM xiaoqu WHERE id = 1
SELECT id, title FROM xiaoqu WHERE areacode = '000100010001'
-- 错误
select ID, title from XiaoQu where id = 1
SELECT id, title FROM xiaoqu WHERE areacode = "000100010001"
表的设计
MySQL 存储引擎使用 InnoDB
不用纠结,没有特殊原因的情况下,作为 OLTP 的 MySQL 使用 InnoDB 引擎。
字符集使用 UTF-8
Charset 为 utf8;Collation 为 utf8_general_ci。
平衡是门艺术
效率优先,提升性能
没有绝对的对与错
适当牺牲范式,加入冗余
会增加代码复杂度
正确使用时间类型
MySQL 应当正确设置 time_zone。
精确到秒的时间采用 TIMESTAMP
精确到日期使用 DATE
一般不使用 DATETIME 类型
每个表都含有ins_time、edt_time
不允许使用字符串类型存储时间
字段定义为 NOT NULL
真的需要 NULL 值吗?如果不确定,就将字段设置为 NOT NULL。
避免使用NULL字段
很难进行查询优化 NULL列加索引,需要额外空间 含NULL复合索引无效
字段设置 DEFAULT 值
设置为 NOT NULL 的字段,需要设置一个缺省值。
优先使用ENUM或SET
字符串 可能值已知且有限 ENUM占用1字节,转为数值运算 SET视节点定,最多8字节 比较时需要加‘ 单引号(即使是数值)
用好数值类型
原则:适用就好,越小越好
TINYINT< SMALLINT < MEDIUMINT < INT < BIGINT
1 Byte/2 Bytes/3 Bytes/4 Bytes/8 Bytes
FLOAT(4B