SQL審核 | 這里有 MySQL/Oracle 最常用的 SQL 開發(fā)規(guī)則
作者:孫健
SQLE 研發(fā)負責人,負責 SQLE 相關開發(fā);
本文來源:原創(chuàng)投稿
導讀
今天給大家介紹一款最近火熱的SQL開發(fā)神器-SQLE,它是一款開源的SQL質量管理工具,被眾多企業(yè)廣泛使用,容易上手,能與CI/CD流程集成,并支持多種數據庫,能快速開發(fā)一套滿足自己公司使用的SQL開發(fā)規(guī)則。
本文將介紹SQLE 對SQL開發(fā)規(guī)則的一些見解并給出常用的規(guī)則供大家參考。
GitHub上的開源地址:https://github.com/actiontech/sqle
規(guī)則分類
根據日常SQL開發(fā)使用場景,大家可以在以下幾個方面考慮對SQL開發(fā)進行規(guī)范。當我們做好每個環(huán)節(jié),層層規(guī)范那么就可以避免大部分問題。當然SQLE對規(guī)則劃分隨著規(guī)則量的增加會進行更加細致的拆分。
1. 庫表定義
該類規(guī)則主要是針對庫表定義做了不同個維度包括表、字段、索引等的各方面屬性進行標準定義,標準規(guī)定的規(guī)則值可以根據自己業(yè)務場景進行配置,以滿足絕大部分表設計的規(guī)范,當庫表的定義滿足一定的規(guī)范后,這將是一個好的開始。
2. 命名規(guī)范
該類規(guī)則涉及一些公司的數據庫使用紅線,禁止使用來或避免一些潛在的使用上或者維護上的風險。
4. 查詢
該類規(guī)則主要是基于經驗式的對一些常見可能會影響性能的語句進行辨別,例如MySQL中左模糊查詢會導致無法走索引,但并不是說這就一定會慢,當我們在一開始就杜絕這種做法那么可以避免后期的性能下降。
SQL審核工具 SQLE 企業(yè)版近期推出了Oracle審核插件的第一個測試預覽版。我們采集了過往我們在客戶那碰到的問題和行業(yè)專家的建議,整理了一大批Oracle審核規(guī)則。這個版本我們從中挑選出現頻次最高的以及影響范圍最大一批規(guī)則加入到了Oracle審核插件中,這些規(guī)則能覆蓋大多數客戶的大多數場景,卻又不會對客戶使用產生額外的負擔。在后續(xù)的時間內,我們將推出的Oracle審核插件逐步完善規(guī)則的拼圖。接下來的內容將對高頻規(guī)則給出我們的理解。插件的本身開發(fā)之前已經做過介紹,開發(fā)文檔參考:https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/overview.html。
表建議使用主鍵;
表不建議使用外鍵;
索引個數建議不超過閾值;
表字段過多;
復合索引的列數量不建議超過閾值;
表不建議使用指定的字段類型;
表名、列名、索引名的長度不能大于指定字節(jié);
數據庫對象命名禁止使用關鍵字;
不建議使用select *;
delete 和 update 語句,必須帶where條件;
避免使用 having 子句;
不推薦使用子查詢;
禁止除索引外的 drop 操作;
禁止使用視圖;
禁止使用觸發(fā)器;
單條SQL不建議過長;
unique索引必須使用固定前綴;
普通索引必須使用固定前綴。
表關聯(lián)存在笛卡爾積;
表關聯(lián)嵌套循環(huán)層次過多;
表關聯(lián)個數過多;
對大表進行全表掃描;
存在索引執(zhí)行跳躍掃描;
對大索引執(zhí)行全掃描。





MySQL規(guī)則
建議使用規(guī)定的數據庫排序規(guī)則
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 語句必須有l(wèi)imit條件
避免使用不必要的內置函數
使用JOIN連接表查詢建議不超過閾值
建議避免使用select for update
檢查DML操作的表是否超過指定數據量
避免對條件字段使用函數操作
條件字段存在數值和字符的隱式轉換
不建議對條件字段使用負向查詢
不建議對條件字段使用 NULL 值判斷
避免使用標量子查詢
delete/update 語句不能有l(wèi)imit條件
delete/update 語句不能有order by
不建議使用select *
存在多條對同一個表的修改語句,建議合并成一個ALTER語句
禁止使用自定義函數
禁止使用存儲過程
禁止使用觸發(fā)器
禁止使用視圖
不建議使用分區(qū)表相關功能
新建表必須加入if not exists create,保證重復執(zhí)行不報錯
事物隔離級別建議設置成RC
禁止除索引外的drop操作
數據庫名稱必須使用固定后綴結尾
普通索引必須使用固定前綴
表名、列名、索引名的長度不能大于指定字節(jié)
數據庫對象命名只能使用英文、下劃線或數字,首字母必須是英文
數據庫對象命名禁止使用保留字
建議主鍵命名為"PK_表名"
unique索引名必須使用 IDX_UK_表名_字段名
unique索引必須使用固定前綴
建議選擇可選性超過閾值字段作為索引
檢查DDL是否創(chuàng)建冗余的索引
索引創(chuàng)建建議
復合索引的列數量不建議超過閾值
禁止將blob類型的列加入索引
索引個數建議不超過閾值
檢查DDL創(chuàng)建的新索引對應字段是否已存在過多索引
建議創(chuàng)建約束前,先行創(chuàng)建索引
表必須有主鍵
主鍵禁止使用自增
主鍵建議使用自增
主鍵建議使用 bigint 無符號類型,即 bigint unsigned
禁止使用外鍵
以上規(guī)則可在SQLE社區(qū)版產品內體驗,下面是對應規(guī)則的產品截圖:







總結
