【強制】表存儲引擎必須使用InnoDB(針對主庫通常是強制要求的)數據庫
【強制】表字符集默認使用utf8,必要時候使用utf8mb4(我的踩坑:emoji表情存儲問題)性能優化
【強制】禁止使用存儲過程,視圖,觸發器,Event架構
【強制】禁止在數據庫中存儲大文件,例如照片,能夠將大文件存儲在對象存儲系統,數據庫中存儲路徑併發
【強制】禁止在線上環境作數據庫壓力測試app
【強制】測試,開發,線上數據庫環境必須隔離分佈式
【強制】庫名,表名,列名必須用小寫,採用下劃線分隔函數
【推薦】庫名,表名,列名必須見名知義,長度不要超過32字符高併發
【推薦】庫備份必須以bak爲前綴,以日期爲後綴性能
【推薦】從庫必須以-s爲後綴測試
【推薦】備庫必須以-ss爲後綴
【強制】單實例表個數必須控制在2000個之內
【強制】單表分表個數必須控制在1024個之內
【強制】表必須有主鍵,推薦使用UNSIGNED整數爲主鍵
【強制】禁止使用外鍵,若是要保證完整性,應由應用程式實現
【推薦】建議將大字段,訪問頻度低的字段拆分到單獨的表中存儲,分離冷熱數據
【推薦】根據業務區分使用tinyint/int/bigint,分別會佔用1/4/8字節
【推薦】根據業務區分使用char/varchar
【推薦】根據業務區分使用datetime/timestamp
【強制】必須把字段定義爲NOT NULL並設默認值
【強制】使用INT UNSIGNED存儲IPv4,不要用char(15)
【強制】使用varchar(20)存儲手機號,不要使用整數
【強制】使用TINYINT來代替ENUM
【強制】表達是與否概念的字段,必須使用 is_xxx 的方式命名,數據類型是 unsigned tinyint ( 1表示是,0表示否)。
【強制】表名、字段名必須使用小寫字母或數字,禁止出現數字開頭,禁止兩個下劃線中間只 出現數字。數據庫字段名的修改代價很大,由於沒法進行預發佈,因此字段名稱須要慎重考慮。
【強制】表名不使用複數名詞。
【強制】禁用保留字,如 desc、range、match、delayed 等,請參考 MySQL 官方保留字。
【強制】主鍵索引名爲 pk_字段名;惟一索引名爲 uk_字段名;普通索引名則爲 idx_字段名。
【推薦】小數類型爲 decimal,禁止使用 float 和 double。
【強制】若是存儲的字符串長度幾乎相等,使用 char 定長字符串類型。
【強制】varchar 是可變長字符串,不預先分配存儲空間,長度不要超過 5000,若是存儲長 度大於此值,定義字段類型爲 text,獨立出來一張表,用主鍵來對應,避免影響其它字段索 引效率。
【強制】表必備三字段:id, gmt_create, gmt_modified。
【推薦】表的命名最好是加上「業務名稱_表的做用」。
【推薦】庫名與應用名稱儘可能一致。
【推薦】若是修改字段含義或對字段表示的狀態追加時,須要及時更新字段註釋。
【推薦】字段容許適當冗餘,以提升查詢性能,但必須考慮數據一致。冗餘字段應遵循: 1)不是頻繁修改的字段。 2)不是 varchar 超長字段,更不能是 text 字段。
【推薦】單錶行數超過 500 萬行或者單表容量超過 2GB,才推薦進行分庫分表。
【參考】合適的字符存儲長度,不但節約數據庫表空間、節約索引存儲,更重要的是提高檢 索速度。
對象 |
年齡區間 |
類型 |
字節 |
表示範圍 |
---|---|---|---|---|
人 |
150 歲以內 |
unsigned tinyint |
1 |
無符號值:0 到 255 |
龜 |
數百歲 |
unsigned smallint |
2 |
無符號值:0 到 65535 |
恐龍化石 |
數千萬年 |
unsigned int |
4 |
無符號值:0 到約 42.9 億 |
太陽 |
約 50 億年 |
unsigned bigint |
8 |
無符號值:0 到約 10 的 19 次方 |
【推薦】惟一索引使用uniq_[字段名]來命名
【推薦】非惟一索引使用idx_[字段名]來命名
【推薦】單張表索引數量建議控制在5個之內
【推薦】組合索引字段數不建議超過5個
【推薦】不建議在頻繁更新的字段上創建索引
【推薦】非必要不要進行JOIN查詢,若是要進行JOIN查詢,被JOIN的字段必須類型相同,並創建索引
【推薦】理解組合索引最左前綴原則,避免重複建設索引,若是創建了(a,b,c),至關於創建了(a), (a,b), (a,b,c)
【強制】業務上具備惟一特性的字段,即便是多個字段的組合,也必須建成惟一索引。
【強制】超過三個表禁止 join。須要 join 的字段,數據類型必須絕對一致;多表關聯查詢時, 保證被關聯的字段須要有索引。
【強制】在 varchar 字段上創建索引時,必須指定索引長度,不必對全字段創建索引,根據 實際文本區分度決定索引長度便可。
【強制】頁面搜索嚴禁左模糊或者全模糊,若是須要請走搜索引擎來解決。
【推薦】若是有 order by 的場景,請注意利用索引的有序性。order by 最後的字段是組合 索引的一部分,而且放在索引組合順序的最後,避免出現 file_sort 的狀況,影響查詢性能。
【推薦】利用覆蓋索引來進行查詢操做,避免回表。
【推薦】利用延遲關聯或者子查詢優化超多分頁場景。
【推薦】SQL 性能優化的目標:至少要達到 range 級別,要求是 ref 級別,若是能夠是 consts 最好。
【推薦】建組合索引的時候,區分度最高的在最左邊。
【推薦】防止因字段類型不一樣形成的隱式轉換,致使索引失效。
【參考】建立索引時避免有以下極端誤解:
【強制】禁止使用select *,只獲取必要字段
【推薦】insert必須指定字段,禁止使用insert into T values()
【強制】隱式類型轉換會使索引失效,致使全表掃描
【強制】禁止在where條件列使用函數或者表達式
【強制】禁止負向查詢以及%開頭的模糊查詢
【強制】禁止大表JOIN和子查詢(非離線大數據庫)
【推薦】同一個字段上的OR必須改寫問IN,IN的值必須少於50個
【推薦】應用程序必須捕獲SQL異常
【強制】不要使用 count(列名)或 count(常量)來替代 count(*),count(*)是 SQL92 定義的 標準統計行數的語法,跟數據庫無關,跟 NULL 和非 NULL 無關。
【強制】count(distinct col) 計算該列除 NULL 以外的不重複行數,注意 count(distinct col1, col2) 若是其中一列全爲NULL,那麼即便另外一列有不一樣的值,也返回爲0。
【強制】當某一列的值全是 NULL 時,count(col)的返回結果爲 0,但 sum(col)的返回結果爲 NULL,所以使用 sum()時需注意 NPE 問題。
【強制】使用 ISNULL()來判斷是否爲 NULL 值。
【強制】 在代碼中寫分頁查詢邏輯時,若 count 爲 0 應直接返回,避免執行後面的分頁語句。
【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。
【強制】禁止使用存儲過程,存儲過程難以調試和擴展,更沒有移植性。
【強制】數據訂正時,刪除和修改記錄時,要先 select,避免出現誤刪除,確認無誤才能執 行更新語句。
【推薦】in 操做能避免則避免,若實在避免不了,須要仔細評估 in 後邊的集合元素數量,控制在 1000 個以內。
【參考】若是有全球化須要,全部的字符存儲與表示,均以 utf-8 編碼,注意字符統計函數 的區別。
【參考】TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少,但 TRUNCATE 無事務且不觸發 trigger,有可能形成事故,故不建議在開發代碼中使用此語句。
參考材料: