SQL自動審核-自助上線平台
為了讓DBA從日常繁瑣的工作中解放出來,通過SQL自助平台,可以讓開發自上線,開發提交SQL後就會自動返回優化建議,無需DBA的再次審核,從而提升上線效率,有利於建立資料庫開發規範。
借鑒了去哪網Inception的思路並且把美團網SQLAdvisor(索引優化建議)集成在一起,並結合了之前寫的《DBA的40條軍規》納入了審核規則里,用PHP實現。目前在我公司內部使用。
SQL自動審核主要完成兩方面目的:
1、避免性能太差的SQL進入生產系統,導致整體性能降低。
2、檢查開發設計的索引是否合理,是否需要添加索引。
思路其實很簡單:
1、獲取開發提交的SQL
2、對要執行的SQL做分析,觸碰事先定義好的規則來判斷這個SQL是否可以自動審核通過,未通過審核的需要人工處理。
下面是首頁界面:
使用說明:
1、針對select/insert/update/create/alter加了規則,delete需要審批。
2、語句之間要有空格,例where id = 100,沒有空格會影響判斷的準確性。
3、SQL語句後面要加分號; MySQL解析器規定分號才可以執行SQL。
4、反引號`可能會造成上線失敗,需要用文本編輯器替換掉。
5、支持多條SQL解析,用######六個井號分割。
SELECT審核
1、開發人員可以直接將SQL語句提交到平台進行風險評估
2、平台對SQL語句進行分析,自動給出其不符合開發規範的改進意見
3、適用場景:應用開發階段
檢查項:
1、select * 是否有必要查詢所有的欄位?
2、警告!沒有where條件,注意where後面的欄位要加上索引
3、沒有limit會查詢更多的數據
4、警告!子查詢性能低下,請轉為join表關聯
5、提示:in裡面的數值不要超過1000個
6、提示:採用join關聯,注意關聯欄位要都加上索引,如on a.id=b.id
7、提示:MySQL對多表join關聯性能低下,建議不要超過3個表以上的關聯
8、警告!like "%%"雙百分號無法用到索引,like "mysql%"這樣是可以利用到索引的
9、提示:默認情況下,MySQL對所有GROUP BY col1,col2...的欄位進行排序。如果查詢包括GROUP BY,
想要避免排序結果的消耗,則可以指定ORDER BY NULL禁止排序。
10、警告!MySQL里用到order by rand()在數據量比較多的時候是很慢的,因為會導致MySQL全表掃描,故也不會用到索引
11、提示:是否要加一個having過濾下?
12、警告!禁止不必要的order by排序,因為前面已經count統計了
13、警告!MySQL里不支持函數索引,例DATE_FORMAT("create_time","%Y-%m-%d")="2016-01-01"是無法用到索引的,需要改寫為
create_time>="2016-01-01 00:00:00" and create_time
之後會調用美團網SQLAdvisor進行索引檢查
使用概述:
1、選中你的資料庫名字
2、在對話框中輸入你要提交的SQL
3、點擊提交審核按鈕
提交以後,系統自動返回SQL優化改進意見。
insert審核
檢查項:
1、警告: insert 表1 select 表2,會造成鎖表。
審核通過以後,會彈出用戶名和密碼,提示上線:
點擊我要上線按鈕,會調用MySQL客戶端進行語法校驗和表是否存在等校驗。
update審核
檢查項:
1、警告!沒有where條件,update會全表更新,禁止執行!!!
2、更新的行數小於10000行,可以由開發自助執行。否則請聯繫DBA執行!!!
防止where 1=1 繞過審核規則
必須寫真實的where條件才可以執行更新操作。
上線成功的SQL會記錄到一張操作日誌表裡,並且會把binlog位置點記錄下來,方便日後的回滾操作。
create審核
檢查項:
1、警告!表沒有主鍵
2、警告!表主鍵應該是自增的,缺少AUTO_INCREMENT
3、提示:id自增欄位默認值為1,auto_increment=1
4、警告!表沒有索引
5、警告!表中的索引數已經超過5個,索引是一把雙刃劍,它可以提高查詢效率但也會降低插入和更新的速度並佔用磁碟空間
6、警告!表欄位沒有中文注釋,COMMENT應該有默認值,如COMMENT "姓名"
7、警告!表沒有中文注釋
8、警告!表缺少utf8字符集,否則會出現亂碼
9、警告!表存儲引擎應設置為InnoDB
10、警告!表應該為timestamp類型加默認系統當前時間
審核通過後,就可以上線了
上線失敗提示:
alter審核
檢查項:
1、警告!不支持create index語法,請更改為alter table add index語法。
2、警告!更改表結構要減少與資料庫的交互次數,應改為,例alter table t1 add index IX_uid(uid),add index IX_name(name)
3、表記錄小於100萬行,可以由開發自助執行。否則表太大請聯繫DBA執行!
資料庫上線工單查詢(只記錄成功執行的SQL)
更多分享,敬請關注
本文來源網路,侵立刪!
TAG:PHP技術大全 |