編寫(xiě)目的:
為避免開(kāi)發(fā)過(guò)程產(chǎn)生不適當(dāng)?shù)?SQL 內(nèi)容,導(dǎo)致創(chuàng)建的數(shù)據(jù)庫(kù)對(duì)象過(guò)程中出現(xiàn)問(wèn)題或者數(shù)據(jù)庫(kù)使用中耗費(fèi)更多系統(tǒng)資源,特制定本規(guī)范文檔作為集團(tuán)信息中心(xxx)MySQL數(shù)據(jù)庫(kù)的 SQL 開(kāi)發(fā)規(guī)范,
以保障各系統(tǒng)數(shù)據(jù)庫(kù)高效穩(wěn)定運(yùn)行。
二、適用范圍
本規(guī)范文檔適用于集團(tuán)信息中心(xxx)所有使用 MySQL 數(shù)據(jù)庫(kù)的開(kāi)發(fā)疟赊、測(cè)試、生產(chǎn)環(huán)境峡碉。所有使用 MySQL 數(shù)據(jù)庫(kù)的開(kāi)發(fā)近哟、測(cè)試及 DBA 人員均要閱讀本文檔。
建議開(kāi)發(fā)人員和測(cè)試人員閱讀“SQL 規(guī)范要求”內(nèi)容鲫寄;DBA 人員詳細(xì)閱讀“SQL 規(guī)范要求”及“規(guī)范詳細(xì)說(shuō)明”內(nèi)容吉执。
三、術(shù)語(yǔ)
序號(hào) | 名詞 | 名詞解釋 | 備注 |
---|---|---|---|
1 | 最左原則 | 又稱(chēng)“最左前綴原則”或“ 最左前綴匹配原則”地来,指 MySQL 創(chuàng)建復(fù)合索引的規(guī)則是首先會(huì)對(duì)復(fù)合索引的最左邊的鼠证,也就是第一個(gè)字段的數(shù)據(jù)進(jìn)行排序,在第一個(gè)字段的排序基礎(chǔ)上靠抑,然后再對(duì)后面第二個(gè)字段進(jìn)行排序量九。 | MySQL 索引規(guī)則中要求復(fù)合索引中要想使用第二個(gè)字段,則必須先使用到第一個(gè)字段。 |
2 | 強(qiáng)制級(jí)別 | 該級(jí)別務(wù)必遵守荠列,是 MySQL 開(kāi)發(fā)過(guò)程的“軍規(guī)”类浪,違反該級(jí)別規(guī)則禁止上線。 | 無(wú) |
3 | 強(qiáng)烈建議級(jí)別 | 該級(jí)別介于強(qiáng)制與建議級(jí)別之間肌似,因較難量化及考量费就,故不適合做強(qiáng)制要求,但進(jìn)行開(kāi)發(fā)時(shí)也應(yīng)結(jié)合業(yè)務(wù)特點(diǎn)來(lái)遵守該級(jí)別規(guī)定川队。 | 無(wú) |
三力细、SQL 規(guī)范要求
(一) 強(qiáng)制級(jí)別
同種用途的字段在不同表中保持同一字段定義」潭睿【詳情】
每個(gè)表必須有主鍵眠蚂。
表引擎選用 INNODB 引擎;字符集統(tǒng)一使用 UTF8斗躏∈呕郏【詳情】
表及字段必須有 COMMENT 注釋說(shuō)明,而且注釋禁止使用半角(英文)分號(hào)啄糙〉殉迹【詳情】
在滿足需求的提前下,選擇性能更高的字段類(lèi)型隧饼。按性能從好到差的排序?yàn)椋?/p>
TINYINT>SMALLINT>MEDIUMINT>INT>BIGINT>CHAR/VARCHAR>TEXT/BLO B沈堡;【詳情】
- 根據(jù)字段實(shí)際存儲(chǔ)情況選擇合適的字段長(zhǎng)度,在滿足業(yè)務(wù)需求前提下燕雁,字段長(zhǎng)度盡可能最小長(zhǎng)度的定義踱蛀。【詳情】
例如:能使用 VARCHAR(10)則不使用 VARCHAR(100)贵白。VARCHAR(N),N 表示的是字符數(shù)不是字節(jié)數(shù)崩泡,比如 VARCHAR(255)禁荒,可以最大可存儲(chǔ) 255 個(gè)漢字,需要根據(jù)實(shí)際的寬度來(lái)選擇 N角撞。
- 每個(gè)表必須要有 update_time 字段呛伴。【詳情】
update_time 字段定義:
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '記錄更新時(shí)間'
- 禁止冗余索引谒所、重復(fù)索引热康。【詳情】
合理創(chuàng)建復(fù)合索引(避免冗余)劣领;如:索引(a,b,c) 相當(dāng)于索引(a)姐军、(a,b)和(a,b,c)。
查詢數(shù)據(jù)時(shí),禁止使用“SELECT *”奕锌,需給出明確的字段著觉。【詳情】
INSERT 語(yǔ)句必須列出所有使用的字段名惊暴”穑【詳情】
UPDATE 和 DELETE 必須要檢查是否需要帶 WHERE 條件,防止整張表被誤修改或誤刪除辽话。
在進(jìn)行結(jié)果集合并(UNION 或 UNION ALL)時(shí)肄鸽,若無(wú)需對(duì)結(jié)果進(jìn)行去重,則用 UNION ALL(UNION 有去重開(kāi)銷(xiāo))油啤。
WHERE 后面條件典徘,如果用到復(fù)合索引,注意 MySQL 遵循最左原則村砂±谜【詳情】
所有數(shù)據(jù)庫(kù)對(duì)象(庫(kù)名,表名础废,字段名等)的命名汛骂,不得使用漢字及特殊符號(hào)(包括空格、逗號(hào)及常用 SQL 關(guān)鍵字等)评腺。
生產(chǎn)環(huán)境數(shù)據(jù)庫(kù)遷移中使用的表 bc_stop_capture 表結(jié)構(gòu)為
CREATE TABLE IF NOT EXISTS bc_stop_capture(tableName VARCHAR(50)
PRIMARY KEY);
生產(chǎn)環(huán)境數(shù)據(jù)庫(kù)的遷移操作帘瞭,步驟如下:
(例,遷移對(duì)象表為 inventory_book 時(shí))
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 在數(shù)據(jù)遷移完成后不能刪除蒿讥。
數(shù)據(jù)遷移操作必須按照遷移步驟執(zhí)行蝶念,否則下游各系統(tǒng)會(huì)將遷移動(dòng)作識(shí)別為刪除操作。
(二) 強(qiáng)烈建議級(jí)別
分表的分片字段無(wú)需建立索引芋绸。因該分片字段的數(shù)據(jù)內(nèi)容均一樣媒殉,建立索引無(wú)意義。
WHERE 后面條件摔敛,需防止字段類(lèi)型被隱式強(qiáng)制轉(zhuǎn)換廷蓉。【詳情】
SQL 語(yǔ)句中盡量少用 JOIN马昙,而應(yīng)該在程序中組裝數(shù)據(jù)桃犬,讓 SQL 更簡(jiǎn)單⌒欣悖【詳情】
將大表中使用頻率高的字段和使用頻率低的字段攒暇,拆分成兩張表存儲(chǔ)∽臃浚【詳情】
(三) 建議級(jí)別
所有數(shù)據(jù)庫(kù)對(duì)象(庫(kù)名形用,表名就轧,字段名等)不建議超過(guò) 30 個(gè)字符。
所有數(shù)據(jù)庫(kù)對(duì)象(庫(kù)名尾序,表名钓丰,字段名等)應(yīng)全部為小寫(xiě),單詞之間使用下劃線“_”分割每币。
所有數(shù)據(jù)庫(kù)對(duì)象(庫(kù)名携丁,表名,字段名等)應(yīng)使用富有意義的英文兰怠,一般情況下不建議使用拼音命名梦鉴。
歷史表以“_his”為后綴。例如:inventory_his
五揭保、規(guī)范詳細(xì)說(shuō)明
待補(bǔ)充肥橙。。秸侣。