最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库。今天也是对公司的开发做了一次培训,PPT就不放上来了,里面有十来个生产SQL的案例。因为规范大部分还是具有通用性,所以也借鉴了像去哪儿和赶集的规范,但实际在撰写本文的过程中,每一条规范的背后无不是在工作中有参照的反面例子的。如果时间可以的话,会抽出一部分或分析其原理,或用案例证明。
一. 命名规范
1.库名、表名、字段名必须使用小写字母,并采用下划线分割
(1)MySQL有配置参数lower_case_table_names=1,即库表名以小写存储,大小写不敏感。如果是0,则库表名以实际情况存储,大小写敏感;如果是2,以实际情况存储,但以小写比较。
(2)如果大小写混合使用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱。
(3)字段名显示区分大小写,但实际使⽤时不区分,即不可以建立两个名字一样但大小写不一样的字段。
(4)为了统一规范, 库名、表名、字段名使用小写字母。
2.库名以 d 开头,表名以 t 开头,字段名以 f_ 开头
(1)比如表 t_crm_relation,中间的 crm 代表业务模块名
(2)视图以view_开头,事件以event_开头,触发器以trig_开头,存储过程以proc_开头,函数以func_开头
(3)普通索引以idx_col1_col2命名,唯一索引以uk_col1_col2命名(可去掉f_公共部分)。如 idx_companyid_corpid_contacttime(f_company_id,f_corp_id,f_contact_time)
3.库名、表名、字段名禁止超过32个字符,需见名知意
库名、表名、字段名支持最多64个字符,但为了统一规范、易于辨识以及减少传输量,禁止超过32个字符
4.临时库、表名须以tmp加日期为后缀
如 t_crm_relation_tmp0425。备份表也类似,形如 _bak20160425 。
5.按日期时间分表须符合_YYYY[MM][DD]格式
这也是为将来有可能分表做准备的,比如t_crm_ec_record_201403,但像 t_crm_contact_at201506就打破了这种规范。
不具有时间特性的,直接以 t_tbname_001 这样的方式命名。
二. 库表基础规范
1.使用Innodb存储引擎
5.5版本开始mysql默认存储引擎就是InnoDB,5.7版本开始,系统表都放弃MyISAM了。
2.表字符集统一使用UTF8
(1)UTF8字符集存储汉字占用3个字节,存储英文字符占用一个字节
(2)校对字符集使用默认的 utf8_general_ci
(3)连接的客户端也使用utf8,建立连接时指定charset或SET NAMES UTF8;。(对于已经在项目中长期使用latin1的,救不了了)
(4)如果遇到EMOJ等表情符号的存储需求,可申请使用UTF8MB4字符集
新闻热点
疑难解答