架构之路-SQL规范

目录

一.命名规范:

二.表结构规范:

三.索引使用规范:

四.SQL编写规范:


一.命名规范:

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,过大会导致性能问题

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值