婚戀網(wǎng)站翻譯可以做嗎模板建站常規(guī)流程
【重學(xué) MySQL】四十九、阿里 MySQL 命名規(guī)范及 MySQL8 DDL 的原子化
- 阿里 MySQL 命名規(guī)范
- MySQL8 DDL的原子化
阿里 MySQL 命名規(guī)范
- 【
強(qiáng)制
】表名、字段名必須使用小寫字母或數(shù)字,禁止出現(xiàn)數(shù)字開頭,禁止兩個(gè)下劃線中間只出現(xiàn)數(shù)字。數(shù)據(jù)庫(kù)字段名的修改代價(jià)很大,因?yàn)闊o法進(jìn)行預(yù)發(fā)布,所以字段名稱需要慎重考慮。- 正例:aliyun_admin,rdc_config,level3_name
- 反例:AliyunAdmin,rdcConfig,level_3_name
- 【
強(qiáng)制
】禁用保留字,如 desc、range、match、delayed 等,請(qǐng)參考 MySQL 官方保留字。 - 【
強(qiáng)制
】表必備三字段:id, gmt_create, gmt_modified。- 說明:其中 id 必為主鍵,類型為BIGINT UNSIGNED、單表時(shí)自增、步長(zhǎng)為 1。gmt_create, gmt_modified 的類型均為 DATETIME 類型,前者現(xiàn)在時(shí)表示主動(dòng)式創(chuàng)建,后者過去分詞表示被動(dòng)式更新
- 【
推薦
】表的命名最好是遵循 “業(yè)務(wù)名稱_表的作用”。- 正例:alipay_task 、 force_project、 trade_config
- 【
推薦
】庫(kù)名與應(yīng)用名稱盡量一致。 - 【參考】合適的字符存儲(chǔ)長(zhǎng)度,不但節(jié)約數(shù)據(jù)庫(kù)表空間、節(jié)約索引存儲(chǔ),更重要的是提升檢索速度。
對(duì)象 | 年齡區(qū)間 | 類型 | 字節(jié) | 表示范圍 |
---|---|---|---|---|
人 | 150歲之內(nèi) | tinyint unsigned | 1 | 無符號(hào)值:0到255 |
龜 | 數(shù)百歲 | smallint unsigned | 2 | 無符號(hào)值:0到65535 |
恐龍化石 | 數(shù)千萬年 | int unsigned | 4 | 無符號(hào)值:0到約43億 |
太陽(yáng) | 約50億年 | bigint unsigned | 8 | 無符號(hào)值:0到約10的19次方 |
MySQL8 DDL的原子化
MySQL 8.0引入了DDL(數(shù)據(jù)定義語(yǔ)言)的原子性特性,通過統(tǒng)一數(shù)據(jù)字典DD和DDL_LOG機(jī)制來確保DDL操作的原子性。
-
原子DDL的定義:原子DDL語(yǔ)句將數(shù)據(jù)字典更新、存儲(chǔ)引擎操作和與DDL操作相關(guān)聯(lián)的二進(jìn)制日志寫入組合成單個(gè)原子操作。這意味著,即使服務(wù)器在操作過程中停止運(yùn)行,操作也可以提交,將適用的更改保存到數(shù)據(jù)字典、存儲(chǔ)引擎和二進(jìn)制日志中,或者回滾。
-
數(shù)據(jù)字典的統(tǒng)一:在MySQL 8.0之前,元數(shù)據(jù)存儲(chǔ)在元數(shù)據(jù)文件、非事務(wù)表和存儲(chǔ)引擎特定的字典中,這需要中間提交。MySQL 8.0引入了統(tǒng)一的數(shù)據(jù)字典DD,并廢棄了server層的元數(shù)據(jù)(如.frm、.opt、.par、.trg等),將InnoDB的元數(shù)據(jù)抽象出一條DD接口供server層和InnoDB層共用。這消除了中間提交的障礙,使得將DDL語(yǔ)句操作重構(gòu)為原子操作成為可能。
-
DDL_LOG機(jī)制:為了確保DDL操作的原子性,MySQL 8.0還引入了一套DDL_LOG機(jī)制。在執(zhí)行DDL的過程中,會(huì)記錄DDL操作到DDL_LOG表中。DDL_LOG表是InnoDB引擎表,通過保證DDL_LOG數(shù)據(jù)與DD數(shù)據(jù)字典修改達(dá)成一致,來解決DD數(shù)據(jù)字典修改、引擎層修改和寫binlog一致性問題。在DDL事務(wù)提交后,會(huì)讀取DDL_LOG內(nèi)容并進(jìn)行回放執(zhí)行,以完成DDL操作的收尾動(dòng)作。
-
原子DDL的特性:
- 原子DDL支持表DDL語(yǔ)句和非表DDL語(yǔ)句。與表相關(guān)的DDL操作需要存儲(chǔ)引擎支持,目前只有InnoDB存儲(chǔ)引擎支持原子DDL。
- DDL語(yǔ)句,無論是原子的還是其他的,都會(huì)隱式地結(jié)束當(dāng)前會(huì)話中任何活動(dòng)的事務(wù)。這意味著DDL語(yǔ)句不能在另一個(gè)事務(wù)中執(zhí)行,不能在事務(wù)控制語(yǔ)句(如START TRANSACTION)中執(zhí)行,或者與同一事務(wù)中的其他語(yǔ)句結(jié)合使用。
- 原子化的DDL操作在執(zhí)行過程中,如果MySQL服務(wù)突然停止,不會(huì)像之前的版本那樣生成一個(gè)報(bào)錯(cuò)文件,而是會(huì)回滾操作。
綜上所述,遵循阿里MySQL命名規(guī)范可以提高數(shù)據(jù)庫(kù)的可讀性和可維護(hù)性,而MySQL8 DDL的原子化特性則確保了DDL操作的一致性和可靠性。