資料庫sql編寫規範

2021-09-09 09:27:44 字數 2208 閱讀 3940

一 dml語句

select語句必須指定具體欄位名稱,禁止寫成*。因為select *會將不該讀的資料也從mysql裡讀出來,造成磁碟和網絡卡壓力,尤其在有text或者blob欄位的時候。

select語句不要使用union,推薦使用union all,並且union子句個數限制在5個以內。因為union all不需要去重,節省資料庫資源,提高效能。

in值列表限制在500以內。例如select… where userid in(….500個以內…),這麼做是為了減少底層掃瞄,減輕資料庫壓力從而加速查詢。

事務裡批量更新資料需要控制數量,進行必要的sleep,做到少量多次。

除靜態表或小表(100行以內),dml語句必須有where條件,且使用索引查詢。

生產環境禁止使用hint,如sql_no_cache,force index,ignore key,straight join等。因為hint是用來強制sql按照某個執行計畫來執行,但隨著資料量變化我們無法保證自己當初的預判是正確的,因此我們要相信mysql優化器!

where條件裡等號左右字段型別必須一致,否則無法利用索引。

select|update|delete|replace要有where子句,且where子句的條件必需使用索引查詢。

生產資料庫中強烈不推薦大表上發生全表掃瞄,但對於100行以下的靜態表可以全表掃瞄。查詢資料量不要超過錶行數的25%,否則不會利用索引。

where 子句中禁止只使用全模糊的like條件進行查詢,必須有其他等值或範圍查詢條件,否則無法利用索引。

索引列不要使用函式或表示式,否則無法利用索引。如where user_id+2=100,可以改寫成where user_id = 100-2

分頁查詢,當limit起點較高時,可先用過濾條件進行過濾。如select a,b,c from t1 limit 10000,20;優化為: select a,b,c from t1 where id>10000 limit 20;。

當表的規模超過千行時,不建議做count(*),尤其是乙個經常被使用的表,建議在程式端的做好資料插入和刪除的統計工作,再在乙個統計表中更新記錄,避免隨著執行時間的增加,在上億的表上做count(*)

二 多表連線

禁止跨db的join語句。因為這樣可以減少模組間耦合,為資料庫拆分奠定堅實基礎。

禁止在業務的更新類sql語句中使用join,比如update t1 join t2…。

不建議使用子查詢,建議將子查詢sql拆開結合程式多次查詢,或使用join來代替子查詢。

線上環境,多表join不要超過3個表。

在多表join中,盡量選取結果集較小的表作為驅動表,來join其他表。

三 事務

批量運算元據時,需要控制事務處理間隔時間,進行必要的sleep,一般建議值5-10秒。

對於有auto_increment屬性欄位的表的插入操作(單事物),併發需要控制在200以內。

事務裡包含sql不超過5個(支付業務除外)。因為過長的事務會導致鎖資料較久,mysql內部快取、連線消耗過多等雪崩問題。

盡量把一些典型外部呼叫移出事務,如呼叫webservice,訪問檔案儲存等,從而避免事務過長。

四 排序和分組

減少使用order by,和業務溝通能不排序就不排序,或將排序放到程式端去做。order by、group by、distinct這些語句較為耗費cpu,資料庫的cpu資源是極其寶貴的。

order by、group by、distinct這些sql盡量利用索引直接檢索出排序好的資料。如where a=1 order by可以利用key(a,b)。

包含了order by、group by、distinct這些查詢的語句,where條件過濾出來的結果集請保持在1000行以內,否則sql會很慢。盡量使用limit保持行數,內部會根據返回的結果集和buffer大小選擇不同的排序演算法。

五 線上禁止使用的sql語句

禁止使用關聯子查詢,如update t1 set … where name in(select name from user where…);效率極其低下。

禁用procedure、function、trigger、views、event、外來鍵約束。因為他們消耗資料庫資源,降低資料庫例項可擴充套件性。推薦都在程式端實現。

禁止聯表更新語句,如update t1,t2 where t1.id=t2.id…。

資料庫sql指令碼編寫規範

對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 select id from t where num is null可以在num上設定預...

資料庫架構更新Sql語句編寫規範

l 建立資料庫表 下例顯示 pubs 資料庫中所建立的三個表 jobs employee 和publishers 的完整表定義,其中包含所有的約束定義。create table 表名 欄位名1 資料型別 是否允許為 null,欄位名2 資料型別 是否允許為 null 例如 create table ...

資料庫SQL開發規範

1 mysql中,varchar n 中的n代表的是字元數,而不是位元組數。例如varchar 255 表示可以儲存255的中文 2 過大的長度會消耗更多的記憶體。varchar n 儲存時是按照資料實際長度儲存的。當把資料讀入到記憶體時,為了提高效率,是按照n的長度分配記憶體的。3 盡可能將所有列...