MySQL使用規範
一、表設計的規範
1. 每張表必須包含主鍵(id字段)。(無論是臨時表、較小的配置表,還是無業務訪問的
數據表 都必須有主鍵)
a. id:主鍵
1. 主鍵不能包含業務含義。
2. 主鍵在任何情況下不允許被更新。
3. 主鍵必須由特定的主鍵生成系統生成或者自增長字段
2. 作爲表間連接關係的字段,數據類型必須保持嚴格一致,避免索引無法正常使用。
3. 存在過期概念的表,在其設計之初就必須有過期機制,且有明確的過期時間。過期數據
必須遷移至歷史表中。
4、禁止使用外鍵約束
5、禁止使用臨時表
二、數據類型建議
MySQL 數據庫中儘量僅使用下文提及的數據類型。
數值類型
●DECIMAL(M,D)
當表示定點小數的情況下使用該類型。定點數在MySQL 內部以字符串形式存儲,比浮點
數更精確,適合用來表示貨幣等精度高的數據。
●INT 系列
所有整數類型字段使用INT(TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT),根據所
存放的數據大小選擇合適的子類型,且所有INT 類型都不使用長度限制。
字符串類型
●CHAR
當且僅當字段存儲單個字符的情況下,可使用CHAR(1)類型。超過一個字符的字段,使
用可變長度類型。
●VARCHAR
所有可變長度的字段均使用VARCHAR 類型,對於有限類別的字段(如性別、狀態等),
均使用VARCHAR 類型存儲能明顯表現其意義的字符串。
當VARCHAR 字段長度超過4000 時,須和原表進行分拆,與原表主鍵組成新表存儲。
●TEXT 系列
僅當需存儲的字節數可能超過20000 時,使用TEXT 系列類型(TEXT、MEDIUMTEXT、
LONGTEXT)。並和原表進行分拆,與原表主鍵組成新表存儲,且每個表只允許有一個TEXT
系列類型字段。因爲所有MySQL 數據庫都會使用UTF8 字符集,而TEXT 最大隻能存放64K
數據。
時間類型
●DATE
只需要精確到天的字段使用DATE 類型。精確到“天”的取當前時期的操作使用CURDATE()
函數實現。
●DATETIME
需要精確到時間(時、分、秒)的字段使用DATETIME 類型。精確到“秒”的取當前時
間的操作使用 NOW()函數實現。
三、數據庫設計相關要求
1. 除主鍵外,需存在唯一性約束的,可通過創建以“uk_”爲前綴的唯一索引實現,但應
用中需要同時有唯一性檢查邏輯。
2 禁止任何業務邏輯通過封裝在數據庫中的 procedure/function/trigger 實現。
3、禁止業務邏輯使用計劃任務。
4、所有 Query 的 Where 條件中的變量,儘量使用綁定變量來實現,
5、禁止使用函數,在程序中完成邏輯功能
四、Sql 相關要求
1、數據類型轉換
原則
避免因數據類型轉換導致執行計劃有誤。
說明
●where 條件中的過濾字段如需轉換類型,只可轉換過濾值,不可轉換被過濾字段。
●表連接操作中,作爲連接條件的字段的數據類型嚴格一致。
2、“c o u n t (…)”使用
除非是明確目的是統計某個字段上值不爲空的記錄的數目,否者只允許之用 count(*),
而不允許使用 count(column_name) 或者 count(1)。
3、“l i k e …”使用
只允許使用右模糊,不允許使用全模糊。
示例
禁止:
select column_name from table_name like '%abc%';
允許:
select column_name from table_name like 'abc%';
4、“select * from …”使用
原則
爲避免查詢中無用字段參與排序操作而導致的性能降低及潛在的安全隱患。原則上不建
議使用“select * from …”。
說明
●當結果集中無需列出被查詢表的所有字段,且查詢中存在“order by”語句時。禁止
使用“select *”取出所有字段。
●連接查詢中,禁止使用“select *”。
5、表連接
原則
規範連接語法以方便 SQL 腳本的閱讀及提升連接操作性能。
說明
●非外連接查詢中,連接表在“from”子句中列出,並以逗號分隔;連接條件在“where”
子句中列出,而不允許使用 join … on 方式實現 join。
●外連接查詢中,可使用“left join … on”語法;外連接一律使用“left join”表
示。
●可以改寫爲連接的子查詢禁止使用子查詢方式,而應改寫爲連接方式。
示例 a.
非規範用法1:select col1 from tbl1
where col2 in (select col3 from tbl2);
規範化用法1:select col1 from tbl1,tbl2
where tbl1.col2 = tbl2.col3;
非規範用法2:select col1 from tbl1
6、儘量將OR查詢拆分爲多個SQL做UNION ALL或在程序拼接(因爲mysql本身優化器缺陷)
五、字符集
MySQL 數據庫都會使用UTF8 字符集,所有連接必須是utf8字符集。無特殊情況,不允許
使用gbk和latin1
六、關於DDL操作
閉市期間進行數據庫生產變更DDL操作,同時儘可能在業務壓力很小的情況下進行,如果
對造成的影響不確定,請與平臺架構團隊溝通確認後再實施變更操作。
七、關於應用服務器
所留連接生產數據庫服務器,請將IP在上線前發給平臺組MySQL管理組(管文琦、王成瑞)
八、關於視圖
考慮的sql效率 任何情況下 不允許使用視圖
1. 每張表必須包含主鍵(id字段)。(無論是臨時表、較小的配置表,還是無業務訪問的
數據表 都必須有主鍵)
a. id:主鍵
1. 主鍵不能包含業務含義。
2. 主鍵在任何情況下不允許被更新。
3. 主鍵必須由特定的主鍵生成系統生成或者自增長字段
2. 作爲表間連接關係的字段,數據類型必須保持嚴格一致,避免索引無法正常使用。
3. 存在過期概念的表,在其設計之初就必須有過期機制,且有明確的過期時間。過期數據
必須遷移至歷史表中。
4、禁止使用外鍵約束
5、禁止使用臨時表
二、數據類型建議
MySQL 數據庫中儘量僅使用下文提及的數據類型。
數值類型
●DECIMAL(M,D)
當表示定點小數的情況下使用該類型。定點數在MySQL 內部以字符串形式存儲,比浮點
數更精確,適合用來表示貨幣等精度高的數據。
●INT 系列
所有整數類型字段使用INT(TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT),根據所
存放的數據大小選擇合適的子類型,且所有INT 類型都不使用長度限制。
字符串類型
●CHAR
當且僅當字段存儲單個字符的情況下,可使用CHAR(1)類型。超過一個字符的字段,使
用可變長度類型。
●VARCHAR
所有可變長度的字段均使用VARCHAR 類型,對於有限類別的字段(如性別、狀態等),
均使用VARCHAR 類型存儲能明顯表現其意義的字符串。
當VARCHAR 字段長度超過4000 時,須和原表進行分拆,與原表主鍵組成新表存儲。
●TEXT 系列
僅當需存儲的字節數可能超過20000 時,使用TEXT 系列類型(TEXT、MEDIUMTEXT、
LONGTEXT)。並和原表進行分拆,與原表主鍵組成新表存儲,且每個表只允許有一個TEXT
系列類型字段。因爲所有MySQL 數據庫都會使用UTF8 字符集,而TEXT 最大隻能存放64K
數據。
時間類型
●DATE
只需要精確到天的字段使用DATE 類型。精確到“天”的取當前時期的操作使用CURDATE()
函數實現。
●DATETIME
需要精確到時間(時、分、秒)的字段使用DATETIME 類型。精確到“秒”的取當前時
間的操作使用 NOW()函數實現。
三、數據庫設計相關要求
1. 除主鍵外,需存在唯一性約束的,可通過創建以“uk_”爲前綴的唯一索引實現,但應
用中需要同時有唯一性檢查邏輯。
2 禁止任何業務邏輯通過封裝在數據庫中的 procedure/function/trigger 實現。
3、禁止業務邏輯使用計劃任務。
4、所有 Query 的 Where 條件中的變量,儘量使用綁定變量來實現,
5、禁止使用函數,在程序中完成邏輯功能
四、Sql 相關要求
1、數據類型轉換
原則
避免因數據類型轉換導致執行計劃有誤。
說明
●where 條件中的過濾字段如需轉換類型,只可轉換過濾值,不可轉換被過濾字段。
●表連接操作中,作爲連接條件的字段的數據類型嚴格一致。
2、“c o u n t (…)”使用
除非是明確目的是統計某個字段上值不爲空的記錄的數目,否者只允許之用 count(*),
而不允許使用 count(column_name) 或者 count(1)。
3、“l i k e …”使用
只允許使用右模糊,不允許使用全模糊。
示例
禁止:
select column_name from table_name like '%abc%';
允許:
select column_name from table_name like 'abc%';
4、“select * from …”使用
原則
爲避免查詢中無用字段參與排序操作而導致的性能降低及潛在的安全隱患。原則上不建
議使用“select * from …”。
說明
●當結果集中無需列出被查詢表的所有字段,且查詢中存在“order by”語句時。禁止
使用“select *”取出所有字段。
●連接查詢中,禁止使用“select *”。
5、表連接
原則
規範連接語法以方便 SQL 腳本的閱讀及提升連接操作性能。
說明
●非外連接查詢中,連接表在“from”子句中列出,並以逗號分隔;連接條件在“where”
子句中列出,而不允許使用 join … on 方式實現 join。
●外連接查詢中,可使用“left join … on”語法;外連接一律使用“left join”表
示。
●可以改寫爲連接的子查詢禁止使用子查詢方式,而應改寫爲連接方式。
示例 a.
非規範用法1:select col1 from tbl1
where col2 in (select col3 from tbl2);
規範化用法1:select col1 from tbl1,tbl2
where tbl1.col2 = tbl2.col3;
非規範用法2:select col1 from tbl1
6、儘量將OR查詢拆分爲多個SQL做UNION ALL或在程序拼接(因爲mysql本身優化器缺陷)
五、字符集
MySQL 數據庫都會使用UTF8 字符集,所有連接必須是utf8字符集。無特殊情況,不允許
使用gbk和latin1
六、關於DDL操作
閉市期間進行數據庫生產變更DDL操作,同時儘可能在業務壓力很小的情況下進行,如果
對造成的影響不確定,請與平臺架構團隊溝通確認後再實施變更操作。
七、關於應用服務器
所留連接生產數據庫服務器,請將IP在上線前發給平臺組MySQL管理組(管文琦、王成瑞)
八、關於視圖
考慮的sql效率 任何情況下 不允許使用視圖
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.