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

8.用执行计划分析SQL性能      EXPLAIN PLAN是一个很好的分析SQL语句的工具,它可以在不执行SQL的情况下分析语句      通过分析,我们就可以知道ORACLE是怎样连接表,使用什么方式扫描表(索引扫描或全表扫描),以及使用到的索引名称      按照从里到外,从上到下的次序解读分析的结果      EXPLAIN PLAN的分析结果是用缩进的格式排列的,最内部的操作将最先被解读,如果两个操作处于同一层中,带有最小操作号的将首先被执行      目前许多第三方的工具如PLSQL Developer和TOAD等都提供了极其方便的EXPLAIN PLAN工具      PG需要将自己添加的查询SQL文记入log,然后在EXPLAIN PLAN中进行分析,尽量减少全表扫描      ORACLE SQL性能优化系列      1.选择最有效率的表名顺序(只在基于规则的优化器中有效)      ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理      在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表      当ORACLE处理多个表时,会运用排序及合并的方式连接它们      首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序;      然后扫描第二个表(FROM子句中最后第二个表);      最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并      例如:      表 TAB1 16,384 条记录      表 TAB2 5 条记录      选择TAB2作为基础表 (最好的方法)      select count(*) from tab1,tab2 执行时间0.96秒      选择TAB2作为基础表 (不佳的方法)      select count(*) from tab2,tab1 执行时间26.09秒      如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表      例如:   EMP表描述了LOCATION表和CATEGORY表的交集   SELECT *   FROM LOCATION L,   CATEGORY C,   EMP E   WHERE E.EMP_NO BETWEEN 1000 AND 2000   AND E.CAT_NO = C.CAT_NO   AND E.LOCN = L.LOCN      将比下列SQL更有效率   SELECT *   FROM EMP E ,   LOCATION L ,   CATEGORY C   WHERE E.CAT_NO = C.CAT_NO   AND E.LOCN = L.LOCN   AND E.EMP_NO BETWEEN 1000 AND 2000      2.WHERE子句中的连接顺序      ORACLE采用自下而上的顺序解析WHERE子句      根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾      例如:   (低效,执行时间156.3秒)   SELECT *   FROM EMP E   WHERE SAL > 50000   AND JOB = 'MANAGER'   AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);      (高效,执行时间10.6秒)   SELECT *   FROM EMP E   WHERE 25 50000   AND JOB = 'MANAGER';      3.SELECT子句中避免使用'*'      当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用'*'是一个方便的方法,不幸的是,这是一个非常低效的方法      实际上,ORACLE在解析的过程中,会将'*'依次转换成所有的列名      这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间      4.减少访问数据库的次数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值