SQL审核 | 这里有 MySQL/Oracle 最常用的 SQL 开发规则
作者:孙健
SQLE 研发负责人,负责 SQLE 相关开发;
本文来源:原创投稿
导读
今天给大家介绍一款最近火热的SQL开发神器-SQLE,它是一款开源的SQL质量管理工具,被众多企业广泛使用,容易上手,能与CI/CD流程集成,并支持多种数据库,能快速开发一套满足自己公司使用的SQL开发规则。
本文将介绍SQLE 对SQL开发规则的一些见解并给出常用的规则供大家参考。
GitHub上的开源地址:https://github.com/actiontech/sqle
规则分类
根据日常SQL开发使用场景,大家可以在以下几个方面考虑对SQL开发进行规范。当我们做好每个环节,层层规范那么就可以避免大部分问题。当然SQLE对规则划分随着规则量的增加会进行更加细致的拆分。
1. 库表定义
该类规则主要是针对库表定义做了不同个维度包括表、字段、索引等的各方面属性进行标准定义,标准规定的规则值可以根据自己业务场景进行配置,以满足绝大部分表设计的规范,当库表的定义满足一定的规范后,这将是一个好的开始。
2. 命名规范
该类规则涉及一些公司的数据库使用红线,禁止使用来或避免一些潜在的使用上或者维护上的风险。
4. 查询
该类规则主要是基于经验式的对一些常见可能会影响性能的语句进行辨别,例如MySQL中左模糊查询会导致无法走索引,但并不是说这就一定会慢,当我们在一开始就杜绝这种做法那么可以避免后期的性能下降。
SQL审核工具 SQLE 企业版近期推出了Oracle审核插件的第一个测试预览版。我们采集了过往我们在客户那碰到的问题和行业专家的建议,整理了一大批Oracle审核规则。这个版本我们从中挑选出现频次最高的以及影响范围最大一批规则加入到了Oracle审核插件中,这些规则能覆盖大多数客户的大多数场景,却又不会对客户使用产生额外的负担。在后续的时间内,我们将推出的Oracle审核插件逐步完善规则的拼图。接下来的内容将对高频规则给出我们的理解。插件的本身开发之前已经做过介绍,开发文档参考:https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/overview.html。
表建议使用主键;
表不建议使用外键;
索引个数建议不超过阈值;
表字段过多;
复合索引的列数量不建议超过阈值;
表不建议使用指定的字段类型;
表名、列名、索引名的长度不能大于指定字节;
数据库对象命名禁止使用关键字;
不建议使用select *;
delete 和 update 语句,必须带where条件;
避免使用 having 子句;
不推荐使用子查询;
禁止除索引外的 drop 操作;
禁止使用视图;
禁止使用触发器;
单条SQL不建议过长;
unique索引必须使用固定前缀;
普通索引必须使用固定前缀。
表关联存在笛卡尔积;
表关联嵌套循环层次过多;
表关联个数过多;
对大表进行全表扫描;
存在索引执行跳跃扫描;
对大索引执行全扫描。
MySQL规则
建议使用规定的数据库排序规则
BLOB 和 TEXT 类型的字段不可指定非 NULL 的默认值
BLOB 和 TEXT 类型的字段不建议设置为 NOT NULL
不建议使用 BLOB 或 TEXT 类型
char长度大于20时,必须使用varchar类型
不建议使用 ENUM 类型
不建议使用 SET 类型
timestamp 类型的列必须添加默认值
列建议添加注释
除了自增列及大字段列之外,每个列都必须添加默认值
精确浮点数建议使用DECIMAL
必须使用指定数据库字符集
必须使用指定数据库引擎
检查DDL操作的表是否超过指定数据量
表建议添加注释
禁止使用没有where条件的sql语句或者使用where 1=1等变相没有条件的sql
使用LIMIT分页时,避免使用LIMIT M,N
单条insert语句,建议批量插入不超过阈值
查询的扫描不建议超过指定行数(默认值:10000)
该查询使用了文件排序
该查询使用了临时表
禁止使用全模糊搜索或左模糊搜索
insert 语句必须指定column
建议使用UNION ALL,替代UNION
delete/update 语句必须有limit条件
避免使用不必要的内置函数
使用JOIN连接表查询建议不超过阈值
建议避免使用select for update
检查DML操作的表是否超过指定数据量
避免对条件字段使用函数操作
条件字段存在数值和字符的隐式转换
不建议对条件字段使用负向查询
不建议对条件字段使用 NULL 值判断
避免使用标量子查询
delete/update 语句不能有limit条件
delete/update 语句不能有order by
不建议使用select *
存在多条对同一个表的修改语句,建议合并成一个ALTER语句
禁止使用自定义函数
禁止使用存储过程
禁止使用触发器
禁止使用视图
不建议使用分区表相关功能
新建表必须加入if not exists create,保证重复执行不报错
事物隔离级别建议设置成RC
禁止除索引外的drop操作
数据库名称必须使用固定后缀结尾
普通索引必须使用固定前缀
表名、列名、索引名的长度不能大于指定字节
数据库对象命名只能使用英文、下划线或数字,首字母必须是英文
数据库对象命名禁止使用保留字
建议主键命名为"PK_表名"
unique索引名必须使用 IDX_UK_表名_字段名
unique索引必须使用固定前缀
建议选择可选性超过阈值字段作为索引
检查DDL是否创建冗余的索引
索引创建建议
复合索引的列数量不建议超过阈值
禁止将blob类型的列加入索引
索引个数建议不超过阈值
检查DDL创建的新索引对应字段是否已存在过多索引
建议创建约束前,先行创建索引
表必须有主键
主键禁止使用自增
主键建议使用自增
主键建议使用 bigint 无符号类型,即 bigint unsigned
禁止使用外键
以上规则可在SQLE社区版产品内体验,下面是对应规则的产品截图:
总结