目录
一.命名规范:
1 | 库 | a.不使用MySQL保留字 b.使用小写字母 c.清晰明了,根据业务线,环境进行定义 d.使用_分割 |
2 | 表 | a.不使用MySQL保留字 b.使用小写字母 c.清晰明了,根据业务进行定义 d.使用_分割 |
3 | 字段 | a.不使用MySQL保留字 b.使用小写字母 c.清晰明了,根据存储内容进行定义 d.使用_分割 |
4 | 索引 | a.二级索引: idx_column1_column2 b.唯一索引: uniq_column1_column2 |
二.表结构规范:
1 | 类型简单化 | 越简单的类型占用越少的CPU周期和IO, int优于varchar |
2 | 数据类型尽量小 | 越小的数据类型占用越少的CPU周期和IO,tinyint优于int |
3 | 字符串类型 | a.varchar(x) x代表字符数,尽量使用正确的长度,utf8下,一个汉字字符占用三个字节,utf8mb4下,一个汉字字符占用四个字节; b.varchar(25)优于varchar(255):存储同样长度的字段时,占用相同的磁盘资源,但是varchar(255)占用更多的内存 c.varchar(255)优于varchar(256) :varchar会使用额外的空间来记录自身的长度,varchar(255)使用一个字节,varchar(256)使用两个字节;在进行表结构变更时,varchar(255)比varchar(256)更快速,不会影响服务器性能;utf8mb4下,建议varchar(191); d.使用varchar来记录电话号码,以兼容+86等情况 |
4 | 枚举类型 | a.使用tinyint来存储枚举类型,性能要高于enum及varchar类型 |
5 | 数字类型 | a.可以为整数类型指定宽度,但是没有意义,不会限制值的合法范围 b.可以使用unsigned只存正数,来提升存储范围,有符号和无符号使用相同的存储空间,具有同样的性能 c.ipv4地址建议用int类型存储 int占用4字节,char(15)占用至少15字节,一亿行记录下存储空间会多出1.1G |
6 | 时间类型 | a.尽量使用timestamp类型:timestamp占用4个字节存储,优于datetime占用8个字节存储;datetime由date和time两个函数组成,耗费更多的CPU周期;timestamp具有时区功能 b.每行需增加行创建时间: create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', c.每行需增加行更新时间: modify_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' d.timestamp的可存储时间范围为 ‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’ ,当超出这个范围,可以使用datetime替换timestamp |
7 | 行定义 | a.字段必须定义NOT NULL b.字段必须有默认值,建议:数字是0,字符串可以是 '' c.主键尽量使用系统默认的自增主键:ID bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键' d.禁止使用外键 e.适当进行列的冗余,在范式设计和性能之间进行平衡 f.每个字段必须填写注释,枚举类型字段,要注释清楚枚举值:COMMENT='实名状态,0 … 1… …9…' |
8 | 其他 | a.建表:ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表' b.默认使用utf8mb4字符集: DEFAULT CHARSET=utf8mb4 c.默认使用InnoDB存储引擎: ENGINE=InnoDB d.表结构必须填写表的注释:COMMENT='用户表' |
三.索引使用规范:
1.使用过多的索引会降低表的插入速度,建议索引总数量不超过5个
2.辨识度低的列,不需要使用索引,如性别
3.尽量复用索引,不要造成冗余索引
4.联合索引必须控制列的数量,建议联合索引的长度不超过4个字段
5.建立联合索引需要根据复用及辨识度选择列的顺序
6.为提升性能,尽量在其他条件允许下使用覆盖索引
四.SQL编写规范:
1.只允许简单查询,不允许join及子查询,join操作请放在应用端实现
2.禁止使用函数,函数运算在应用端进行,在索引列中作运算, 无法利用索引
3.高频的query应加入到缓存当中
4.禁止使用触发器及存储过程,视图
5.禁止使用like %xx这样无法使用到索引的模糊查询,建议这种使用场景使用ES存储
6.禁止使用select * ,需指定具体需要取出的列
7.insert必须指定字段,不能单纯使用insert .. values()
8.update、delete必须指定where,必须加limit
9.必须正确的使用字段类型,字符串必须加‘’
10.禁止负向查询 NOT != <> !<等 ,可以改为 in 等查询方式
11.控制in()的数量,不要超过500,过大会导致性能问题