規範 | 備註 |
---|---|
數據庫對象名稱統一使用小寫字母並用下劃線分割 | eg:mkt_tool |
數據庫對象名稱禁止使用MySQL保留關鍵字 | eg:password,from等 |
數據庫對象名稱作到見名思義,最長不超過32個字符 | 儘量的精簡、明確 |
臨時表以tmp爲前綴,日期爲後綴 | eg:mp_user_20180921 |
備份表以bak爲前綴,日期爲後綴 | eg:bak_user_20180921 |
全部存儲相同數據的列名和列類型必須一致 | eg:a表的uid與b表的uid數據類型與列類型一致 |
規範 | 備註 |
---|---|
全部數據表使用innodb做爲存儲引擎 | 5.6之後做爲默認引擎,支持事務、行級鎖、更好的恢復性,高併發下性能更好 |
數據庫和表的字符集統一使用UTF8 | 主要是由於避免因爲字符集轉換產生的亂碼,其次utf8包含的字符更多,一個漢字佔3個字節 |
數據表和字段須要添加註釋 | 後續維護方便 |
單表數據量控制在500萬之內 | 單表存儲的數據量大小限制取決於存儲設置和文件系統 |
儘可能作到冷熱數據分離,減少表的寬度 | 避免查詢無用的數據 |
禁止在表中預留字段,禁止在數據庫中存儲圖片及文件等二進制數據 | 按需增長,避免表數據快速增加 |
禁止在線上作數據庫壓力測試 | |
禁止開發環境直接鏈接生產環境數據庫 | 避免數據髒亂 |
規範 | 備註 |
---|---|
限制每張表索引的數量,單表索引不超過5個 | 索引不是越多越好,增長查詢效率的同時,會下降更新的效率 |
每一個innodb表必須有一個主鍵 | 不使用頻繁更新的鍵,不使用hash,字符串,MD5做爲主鍵,優先選取自動增加的列做爲主鍵 |
如何選擇聯合索引的順序 | 區分度最高的放在索引的最左側;字段長度最小的放在最左側;使用度最頻繁的列放在最左側 |
避免創建冗餘度和重複列索引增長了優化器生成查詢計劃的時間 | 對於冗餘索引並不會提升索引的性能,反而影響查詢計劃的生成 |
對於頻繁的查詢優先考慮使用覆蓋索引 | 避免Innodb進行索引的二次查找 |
儘可能避免使用外鍵 | 外鍵用於保證參照完整性,建議在業務端實現外鍵的約束,由於每次寫操做都須要檢測外鍵約束從而下降性能。 |
規範 | 備註 |
---|---|
優先選擇存儲須要的最小的數據類型 | int類型相比字符串類型存儲空間更小,優先使用無符號的整型存儲 |
避免使用text、bolb、enum類型 | 使用text類型的時候注意只能使用前綴索引,不能有默認值 |
儘量的定義爲NOT NULL | 索引NULL須要額外的空間來保存,進行比較和計算時須要對NULL進行特殊處理 |
避免使用字符串存儲日期型的數據,使用TIMESTAMP或DATETIME存儲 | 一、沒法使用日期函數進行比較和計算;二、用字符串存儲須要佔用更多的空間 |
使用decimal類型存儲金額類數據 | 一、decimal在計算時不丟失精度,佔用的空間由定義的寬度決定;二、可用於存儲比bigint更大的數據 |
規範 | 備註 |
---|---|
使用預編譯進行數據庫操做 | 一、一次解析,屢次使用重複使用執行計劃;二、避免動態SQL帶來的SQL注入; |
避免數據類型的隱式轉換 | 隱式轉換、會致使索引失效 eg:select * from test where id = '1' |
充分利用已經存在的索引 | 一、避免使用雙%的查詢,使用後%進行替換;二、一個SQL只能利用到複合索引中的一列進行範圍查詢;三、使用left join或not exists來優化not in操做 |
禁止使用select * 查詢 | 一、消耗更多的CPU和io資源;二、沒法使用到覆蓋索引; |
禁止使用不含字段列表的INSERT語句 | 明確指定insert的字段 |
避免使用子查詢,能夠把子查詢優化爲join操做 | 一、子查詢的結果集沒法使用到索引;二、子查詢產生臨時表操做,數據量大會影響效率;三、產生的臨時表消耗過多的CPU和IO |
避免使用JOIN關聯太多的表 | 一、每join一個表會佔用一部份內存(join_buffer_size);二、會產生臨時表操做,影響查詢效率;三、MySQL容許關聯61個表,最多不超過5個 |
減小同數據庫交互的次數 | 一、數據庫適合批量處理,避免屢次請求數據庫;二、合併多個相同的操做到一塊兒,如一次修改多個字段 |
使用in代替on | in的值不超過500個,in能夠有效的利用索引的 |
禁止使用order by rand()排序 | order by rand()會把全部符合條件的數據裝到內存中排序獲取 |
where從句中禁止對列進行函數轉換和計算 | 對列進行函數轉換會致使沒法使用到索引 eg:where date( time) = '20180123' |
明顯不會有重複值的狀況下使用UNION ALL | UNION會把數據放到臨時表進行去重 |
拆分複雜的大SQL爲多個小SQL | MySQL一個SQL只能使用一個CPU計算,SQL拆分後能夠經過並行執行提升效率 |
規範 | 備註 |
---|---|
超過100萬行的數據批量寫操做,須要分批屢次操做 | 一、大批量的寫操做,容易形成主從延遲 二、產生大量的日誌 三、避免產生大事務操做 |
大表結構修改 | 直接修改大表容易進行鎖表,使用pt-online-schema-change修改表結構 |
禁止爲程序使用的帳戶授予root權限,遵循權限最小原則 | 程序使用的帳戶不許有drop權限,程序使用的帳戶只能鏈接到一個數據庫 |