編寫目的:
爲避免開發過程產生不適當的 SQL 內容,導致創建的數據庫對象過程中出現問題或者數據庫使用中耗費更多系統資源,特制定本規範文檔作爲集團信息中心(xxx)MySQL數據庫的 SQL 開發規範,
以保障各系統數據庫高效穩定運行。
二、適用範圍
本規範文檔適用於集團信息中心(xxx)所有使用 MySQL 數據庫的開發、測試、生產環境。所有使用 MySQL 數據庫的開發、測試及 DBA 人員均要閱讀本文檔。
建議開發人員和測試人員閱讀“SQL 規範要求”內容;DBA 人員詳細閱讀“SQL 規範要求”及“規範詳細說明”內容。
三、術語
序號 | 名詞 | 名詞解釋 | 備註 |
---|---|---|---|
1 | 最左原則 | 又稱“最左前綴原則”或“ 最左前綴匹配原則”,指 MySQL 創建複合索引的規則是首先會對複合索引的最左邊的,也就是第一個字段的數據進行排序,在第一個字段的排序基礎上,然後再對後面第二個字段進行排序。 | MySQL 索引規則中要求複合索引中要想使用第二個字段,則必須先使用到第一個字段。 |
2 | 強制級別 | 該級別務必遵守,是 MySQL 開發過程的“軍規”,違反該級別規則禁止上線。 | 無 |
3 | 強烈建議級別 | 該級別介於強制與建議級別之間,因較難量化及考量,故不適合做強制要求,但進行開發時也應結合業務特點來遵守該級別規定。 | 無 |
三、SQL 規範要求
(一) 強制級別
同種用途的字段在不同表中保持同一字段定義。【詳情】
每個表必須有主鍵。
表引擎選用 INNODB 引擎;字符集統一使用 UTF8。【詳情】
表及字段必須有 COMMENT 註釋說明,而且註釋禁止使用半角(英文)分號。【詳情】
在滿足需求的提前下,選擇性能更高的字段類型。按性能從好到差的排序爲:
TINYINT>SMALLINT>MEDIUMINT>INT>BIGINT>CHAR/VARCHAR>TEXT/BLO B;【詳情】
- 根據字段實際存儲情況選擇合適的字段長度,在滿足業務需求前提下,字段長度儘可能最小長度的定義。【詳情】
例如:能使用 VARCHAR(10)則不使用 VARCHAR(100)。VARCHAR(N),N 表示的是字符數不是字節數,比如 VARCHAR(255),可以最大可存儲 255 個漢字,需要根據實際的寬度來選擇 N。
- 每個表必須要有 update_time 字段。【詳情】
update_time 字段定義:
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '記錄更新時間'
- 禁止冗餘索引、重複索引。【詳情】
合理創建複合索引(避免冗餘);如:索引(a,b,c) 相當於索引(a)、(a,b)和(a,b,c)。
查詢數據時,禁止使用“SELECT *”,需給出明確的字段。【詳情】
INSERT 語句必須列出所有使用的字段名。【詳情】
UPDATE 和 DELETE 必須要檢查是否需要帶 WHERE 條件,防止整張表被誤修改或誤刪除。
在進行結果集合並(UNION 或 UNION ALL)時,若無需對結果進行去重,則用 UNION ALL(UNION 有去重開銷)。
WHERE 後面條件,如果用到複合索引,注意 MySQL 遵循最左原則。【詳情】
所有數據庫對象(庫名,表名,字段名等)的命名,不得使用漢字及特殊符號(包括空格、逗號及常用 SQL 關鍵字等)。
生產環境數據庫遷移中使用的表 bc_stop_capture 表結構爲
CREATE TABLE IF NOT EXISTS bc_stop_capture(tableName VARCHAR(50)
PRIMARY KEY);
生產環境數據庫的遷移操作,步驟如下:
(例,遷移對象表爲 inventory_book 時)
START TRANSACTION; INSERT INTO bc_stop_capture DELETE FROM inventory_book DELETE FROM inventory_book COMMIT;
VALUES('inventory_book'); WHERE bill_date < '2016-06-30'; WHERE tableName='inventory_book';
注意:1. 表 bc_stop_capture 在數據遷移完成後不能刪除。
數據遷移操作必須按照遷移步驟執行,否則下游各系統會將遷移動作識別爲刪除操作。
(二) 強烈建議級別
分表的分片字段無需建立索引。因該分片字段的數據內容均一樣,建立索引無意義。
WHERE 後面條件,需防止字段類型被隱式強制轉換。【詳情】
SQL 語句中儘量少用 JOIN,而應該在程序中組裝數據,讓 SQL 更簡單。【詳情】
將大表中使用頻率高的字段和使用頻率低的字段,拆分成兩張表存儲。【詳情】
(三) 建議級別
所有數據庫對象(庫名,表名,字段名等)不建議超過 30 個字符。
所有數據庫對象(庫名,表名,字段名等)應全部爲小寫,單詞之間使用下劃線“_”分割。
所有數據庫對象(庫名,表名,字段名等)應使用富有意義的英文,一般情況下不建議使用拼音命名。
歷史表以“_his”爲後綴。例如:inventory_his
五、規範詳細說明
待補充。。。