天天看點

MySQL 開發規範

所有的資料庫對象名稱必須使用小寫字母并用下劃線分割(MySQL大小寫敏感,名稱要見名知意,最好不超過32字元)

禁止在資料中存儲圖檔,檔案二進制資料(使用檔案伺服器)

禁止線上上做資料庫壓力測試

禁止從開發環境,測試環境直接連生産環境資料庫

限制每張表上的索引數量,建議單表索引不超過5個(索引會增加查詢效率,但是會降低插入和更新的速度)

避免使用ENUM資料類型(修改ENUM值需要使用ALTER語句,ENUM類型的ORDER BY操作效率低,需要額外操作,禁止使用書值作為ENUM的枚舉值

盡量把所有的字段定義為NOT NULL(索引NULL需要額外的空間來儲存,是以需要暫用更多的記憶體,進行比較和計算要對NULL值做特别的處理)

使用timestamp或datetime類型來存儲時間

同财務相關的金額資料,采用decimal類型(不丢失精度,禁止使用 float 和 double)

所有的資料庫對象名稱禁止使用MySQL保留關鍵字

臨時庫表必須以tmp為字首并以日期為字尾(tmp_)

備份庫和庫必須以bak為字首并以日期為字尾(bak_)

所有存儲相同資料的列名和列類型必須一緻。

資料庫和表的字元集盡量統一使用utf8(字元集必須統一,避免由于字元集轉換産生的亂碼,漢字utf8下占3個位元組)

所有表和字段都要添加注釋COMMENT,從一開始就進行資料字典的維護

建議使用實體分表的方式管理大資料

盡量做到冷熱資料分離,減小表的寬度(mysql限制最多存儲4096列,行數沒有限制,但是每一行的位元組總數不能超過65535。列限制好處:減少磁盤io,保證熱資料的記憶體緩存命中率,避免讀入無用的冷資料)

禁止在表中建立預留字段(無法确認存儲的資料類型,對預留字段類型進行修改,會對表進行鎖定)

避免使用雙%号和like,搜尋嚴禁左模糊或者全模糊(如果需要請用搜尋引擎來解決。索引檔案具有 B-Tree 的最左字首比對特性,如果左邊的值未确定,那麼無法使用此索)

建議使用預編譯語句進行資料庫操作

禁止跨庫查詢(為資料遷移和分庫分表留出餘地,降低耦合度,降低風險)

禁止select * 查詢(消耗更多的cpu和io及網絡帶寬資源,無法使用覆寫索引)

in 操作能避免則避免,若實在避免不了,需要仔細評估 in 後邊的集合元素數量,控制在 1000 個之内

禁止使用order by rand()進行随機排序

避免建立備援索引和重複索引(備援:index(a,b,c) index(a,b) index(a))

禁止給表中的每一列都建立單獨的索引

區分度最高的列放在聯合索引的最左側

盡量把字段長度小的列放在聯合索引的最左側

盡量避免使用外鍵(禁止使用實體外鍵,建議使用邏輯外鍵)

盡量使用 union all 代替 union

拆分複雜的大SQL為多個小SQL( MySQL一個SQL隻能使用一個CPU進行計算)

對于程式連接配接資料庫賬号,遵循權限最小原則

超過三個表禁止 join。(需要 join 的字段,資料類型必須絕對一緻;多表關聯查詢時,保證被關聯的字段需要有索引。即使雙表 join 也要注意表索引、SQL 性能。)

在varchar字段上建立索引時,必須指定索引長度,沒必要對全字段建立索引,根據實際文本區分度決定索引長度即可。

SQL 性能優化的目标:至少要達到 range 級别,要求是 ref 級别,如果可以是 consts最好

使用 ISNULL()來判斷是否為 NULL 值。

盡量不要使用實體删除(即直接删除,如果要删除的話提前做好備份),而是使用邏輯删除,使用字段delete_flag做邏輯删除,類型為tinyint,0表示未删除,1表示已删除

如果有 order by 的場景,請注意利用索引的有序性。order by 最後的字段是組合,索引的一部分,并且放在索引組合順序的最後,避免出現 file_sort 的情況,影響查詢性能。

源碼附件已經打包好上傳到百度雲了,大家自行下載下傳即可~

連結: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd=yu27

提取碼: yu27

百度雲連結不穩定,随時可能會失效,大家抓緊儲存哈。

如果百度雲連結失效了的話,請留言告訴我,我看到後會及時更新~

開源位址

碼雲位址:

http://github.crmeb.net/u/defu

Github 位址:

http://github.crmeb.net/u/defu