MySQL 設計規範(續)

1.1    數據庫字段設計規範

優先選擇符合存儲須要的最小的數據類型算法

對於非負數據採用無符號整型進行存儲;數據庫

varchar(N)N表明字符數,不是字節數Oracle中是字節數,如中文GBK2字節存一個漢字),即MySQLvarchar(2)可存儲2個漢字,佔用6個字節(UTF8)。安全

避免使用text,blob數據類型:網絡

常見的text類型可存儲64k,通常是使用不到這麼大空間;oracle

非要使用,建議把blobtext列分離到單獨的擴展表中,且避免使用select *;ide

text, blob僅能使用前綴索引,且默認狀況下text,blob列均不能有默認值。函數

避免使用ENUM數據類型優化

修改ENUM值須要alter語句;spa

ENUM類型的ORDER BY操做效率低,須要額外操做;設計

禁止使用數值做爲ENUM的枚舉值。

儘量把全部列定義爲NOTNULL

索引NULL列需佔用額外的空間來保存(是否爲空),因此佔用更多空間;

比較和計算對NULL作特別處理,可能索引會失效。

使用TIMESTAMPDATETIME類型存儲時間:

TIMESTAMP 1970-01-01~2038-01-19,佔用4字節和INT存儲相同;

其餘範圍使用DATETIME類型存儲。

金融財務相關類數據,使用DECIMAL類型:

佔用空間有定義的寬度決定;

可用於存儲比bigint更大的整數數據。

1.2    數據庫SQL開發規範

建議使用預編譯語句進行數據庫操做:

只傳參數,比傳遞SQL語句更高效;

相同語句能夠一次解析,屢次使用,提升處理效率。

避免數據類型的隱式轉換

隱式轉換可能致使索引失效。

充分利用表上已存在的索引

避免使用雙%的查詢條件,如’123%’可以使用索引;

一個SQL只能使用聯合索引一列進行範圍查詢;

PSindex(a, b, c)where a = xxand b > low and b < high可以使用到b列的索引,

         wherea > low and a < high and b = xxb這列使用不到索引;

         這個處理和oracle的聯合索引是一致的。

使用left joinnot exists來優化not in操做。

禁止跨庫查詢:

程序鏈接不一樣數據庫使用不一樣的帳號;

爲數據庫遷移和分庫分表留出餘地;

下降業務的耦合度;

避免權限過大產生的安全風險,SQL注入也只能看到一個庫。

禁止使用Select *

消耗過多的CPU, IO, 網絡資源;

沒法使用覆蓋索引;

可減小表結構變動帶來的影響。

禁止使用不含字段列表的INSERT

INSERT INTO T(A, B) VALUES(…….);

可減小表結構變動帶來的影響。

儘可能避免使用子查詢,能夠把子查詢優化爲join操做:

固然並非全部的子查詢都能轉換爲join,如group by等得子查詢;

一般是IN子查詢這樣的語句。

子查詢結果集沒法使用索引;子查詢會產生臨時表操做,若是子查詢數據量大將嚴重影響效率;消耗過多的CPUIO

避免使用JOIN關聯太多的表:

Join一個表多佔用一部份內存(join_buffer_size;

會產生臨時表操做,影響查詢效率;

MySQL最多容許關聯61個表,建議不超過5個。

減小同數據庫的交互次數:

數據庫更適合作批量操做;

合併多個相同的操做到一塊兒;

PS:如alter table t addcolumn c1 int, change column c2 c2 int…

使用in代替or

in的值不要超過500個;

in操做能夠有效的利用索引。

禁止使用order byrand()進行隨機排序:

會把表中全部知足條件的數據裝載到內存中進行排序;

消耗大量的CPU/IO/MEM

處理方式:推薦在程序中獲取一個隨機值,而後在數據庫中獲取數據的方式(親認爲開發人員願意去實現多餘的算法嗎?都但願一句SQL返回結果集)。

WHERE從句禁止對列進行函數轉換和計算:

where date(createtime) = ‘20171010’ à where createtime >= ‘20171010’ and createtime < ‘20171011’

UNIONALL OR UNION

這兩種排序方式和Oracle的徹底一致,UNION ALL不排序,UNION排序。

拆分複雜SQL爲多個小SQL

MySQL一個SQL只能使用一個CPU進行計算;

SQL拆分後能夠經過並行查詢提升處理效率。

1.3    數據庫操做行爲規範

超過100W行數據批量DML操做,要分批屢次進行操做

需考慮主從延遲;

binlog日誌爲row格式產生大量日誌;

避免大事務的操做,阻塞並行。

大表表結構修改

推薦使用pt-online-schema-change修改表結構;

可避免大表修改產生的主動延遲;

避免在對錶字段修改時進行鎖表。

禁止爲程序帳號賦予super權限:

當達到最大鏈接數限制時,還容許使用一個帶有super權限的用戶鏈接;

super權限只能留給DBA處理問題的帳號使用。

對程序帳號,遵循權限最小的原則:

程序在使用數據庫帳號只能在一個DB下使用,不容許跨庫使用;

程序帳號原則上不容許有drop權限。

相關文章
相關標籤/搜索