推薦(免費):mysql視頻教程
基礎規范
-
使用innodb存儲引擎
-
表字符集使用utf-8
-
所有表添加注釋
-
單表數據量建議控制在5000W以內
-
不再數據庫中存儲圖、文件等大數據
-
禁止在線上做數據庫壓力測試
-
禁止測試、開發環境直連數據庫
命名規范
-
庫名表名字段名必須有固定的命名長度,12個字符以內
-
庫名、表名、字段名禁止超過32個字符。須見名之意
-
庫名、表名、字段名禁止使用MySQL保留字
-
臨時庫、表名必須以tmp為前綴,并以日期為后綴
-
備份庫、表必須以bak為前綴,并以日期為后綴
庫、表、字段開發設計規范
-
禁止使用分區表
-
拆分大字段和翻身顧問頻率低的字段,分離冷熱數據
-
用HASH進散表,表名后綴使進制數,下標從0開始
-
按日期時間分表需符合YYYY[MM][DD][HH]格式
-
采用合適的分庫分表策略。例如千庫十表、十庫百表等
-
盡可能不適用text、blob類型
-
所有字段均為not NULL
-
使用unsigned存儲非負數
-
int類型固定占有4字節存儲
-
使用timestamp存儲時間
-
使用int unsigned存儲ipv4
-
使用varbinary存儲大小寫敏感的變長字符串
-
禁止在數據庫中存儲明文密碼,把密碼加密后存儲
-
用好數值類型字段
類型
字節
最小值
最大值
tinyint
1
-128
127
smallint
2
-32768
32767
mediumint
3
-8388608
8388607
int
4
-2147483648
2147483647
bigint
8
-9223372036854775808
9223372036854775807
如果數值字段沒有那么大,就不要用bigint
-
存儲ip最好用int存儲而非char(15)
-
不允許使用enum
-
避免使用null字段
null字段很難查詢一花,null字段的索引需要額外空間,null字段的復合索引無效。
索引規范
-
單個表中的索引數量不超過5個
-
單個索引中的字段數不超過5個
-
對字符串使用前綴索引,前綴索引長度不超過8個字符
-
建議優先考慮前綴索引,必要可添加偽列并建立索引
-
表必須有主鍵
-
不使用更新頻繁的列作為主鍵
-
盡量不選擇字符串列作為主鍵
-
不使用uuid md5 hash這些作為主鍵-太離散
-
默認使非空的唯一鍵作為主鍵
-
建議選擇自增或發號器
-
重要的SQL必須必須被索引,比如update、delete語句的where條件列、order by、group by、distinct的字段
-
多表join的字段注意
<p>1.區分度最大的字段放在前面<br/>2.核SQL優先考慮覆蓋索引<br/>3.避免冗余和重復索引<br/>4.索引要綜合評估數據密度和分布以及考慮查詢和更新比例<br/></p>
-
索引禁忌
<p>1.不在低基數列上建立索引、例如性別<br/>2.不在索引列記性數學運算和函數運算<br/></p>
-
盡量不使用外鍵
<p>1.外鍵用來保護參照完整性,可以業務端實現<br/>2.對父表和字表的操作會互相影響,降低可用性<br/></p>
-
索引命名
<p>1.非唯一索引必須以 inx_字段1_字段22.唯一索引必須以 uniq_字段1_字段2<br/></p>
-
索引字段的默認值不能為空。null非常影響索引的查詢效率。
-
反復查看和表相關的SQL,符合最左前綴的特點建立索引。多條字段重復的索引,要修改語句條件字段的順序,為其建立一條聯合索引,減少索引數量。
-
能使用唯一索引就使用唯一索引
-
研發要經常使用explain,如果發現索引選擇性差,必須讓他們學會使用hint。
SQL規范
-
SQL語句盡可能簡單
-
事物要簡單,整個事物的時間產生過度不要太長
-
避免使用觸發器、函數、存儲過程
-
降低業務耦合度,為sacle out,sharding留有余地
-
避免在數據庫中進行數學運算,mysql不擅長數學運算和邏輯判斷
-
不要用selecy *,查詢那幾個字段就select那幾個字段
-
sql中使用or的改寫成in,or的效率沒有in的效率高
-
in里面數字的個數建議1000以內
-
limit分頁注意效率。limit越大,效率越低。
-
使用union all替代union
-
避免使大表join
-
使用group bu分組、自動排序
-
對數據的更新要打散后批量更新,不要一次更新太多數據
-
減少和數據庫的交互次數
-
注意使用性能分析工具
-
SQL語句要求所有研發,SQL關鍵字全部大寫,每個詞只允許一個空格
-
SQL語句不可以出現隱式轉換
-
能不用not in就不用
-
禁止使用前綴是%的like
-
不使用負向查詢,如 not in、not like
-
禁止在數據庫總跑大查詢
-
使預編譯語句,只傳參數,比傳遞SQL語句更高效。降低SQL注入。
-
禁止使order by rand
-
禁止單條SQL語句同時更新多個表
流程規范
-
所有的建表操作需要提前告知該表涉及的查詢SQL
-
所有的建表需要確定建立那些索引后才可以建表上線
-
所有的改表結構、加索引操作都需要涉及到所該表的查詢SQL發出來通知dba等相關人員
-
在新建表加字段之前,要求研發至少提前3天郵件出來,給dba門評估、優化和審核
-
批量導入、導出數據必須提前通知DBA協助觀察
-
禁止線上從庫執行后端管理和統計類查詢
-
禁止super權限的應用程序賬戶存在
-
不再業務高峰期批量更新、查詢數據庫