最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Mysql OnlineDDL的算法

 更新時間:2025年09月29日 11:22:52   作者:碼上庫里南  
本文主要介紹了講解Mysql OnlineDDL的算法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

MySQL 5.6 及以后版本(尤其是 InnoDB 存儲引擎)引入的一項極其重要的功能,它允許數據庫管理員在執(zhí)行 ALTER TABLE 操作時,最大程度地減少對表鎖定和應用程序可用性的影響。

核心目標: 在 DDL 操作進行時,允許對表進行并發(fā)讀?。⊿ELECT) 和寫入(INSERT, UPDATE, DELETE) 操作。

一、Online DDL 是什么?

Online DDL 是 MySQL 5.6 版本引入,并在后續(xù)版本中不斷增強的一項功能。它允許你在執(zhí)行數據定義語言(DDL)操作時(如 ALTER TABLE),盡可能地減少對表的鎖定時問,使得:

  • 寫操作(DML):在 DDL 操作進行的同時,應用程序依然可以對表執(zhí)行 INSERTUPDATEDELETE 等操作,最大程度保證業(yè)務的連續(xù)性。
  • 讀操作SELECT 查詢通常可以正常進行,不受影響。

這與早期的 Copy Table 機制形成鮮明對比,早期方式需要全程鎖表,直到操作完成,對于大表來說意味著長時間的停機。

二、Online DDL 的三種主要算法

MySQL 在執(zhí)行 DDL 時,根據操作類型的不同,底層主要采用三種算法。理解這些算法是理解 Online DDL 的關鍵。

2.1COPY(復制法)

過程:

  • 創(chuàng)建一個與原始表結構相同的臨時表(.frm,.ibd 等文件)。
  • 在新的臨時表上執(zhí)行 DDL 操作。
  • 將原始表的數據逐行復制到臨時表中。
  • 在此期間,對原始表的寫操作會被阻塞(通常只在數據拷貝的最后階段有短暫鎖表)。
  • 數據復制完成后,用新的臨時表替換原始表,并刪除舊的表。

特點

  • 需要兩倍的存儲空間。
  • 過程中大部分時間會阻塞寫操作,影響業(yè)務。
  • 是 MySQL 5.5 及之前版本的主要方式。

2.2 INPLACE (原地法)

過程

無需創(chuàng)建臨時表文件,直接在原始表的存儲文件(如 InnoDB 的 .ibd 文件)上進行操作。

通常分為兩個階段:

  • 準備階段(Prepare):創(chuàng)建新的.frm文件,準備數據字典更改。可能需要短暫的排他鎖(X鎖)。
  • 執(zhí)行階段(Execute):應用更改到存儲引擎,這通常是操作中最耗時的部分。在此階段,允許并發(fā)的DML操作。

特點

  • 所需磁盤空間遠少于 COPY 算法(通常只需要日志文件的空間)。
  • 允許在執(zhí)行階段進行并發(fā) DML,大大減少了鎖表時間。

2.3INSTANT (即刻法,MySQL 8.0+)

過程

  • 操作只修改數據字典(元數據),而不觸及表中的實際數據或索引。
  • 例如,添加一個可為 NULL 且有默認值的列,只需要在數據字典中記錄一下“這個表有這個列,默認值是什么”,而不需要重建表或復制數據。

特點

  • 速度極快,通常能在毫秒級完成。
  • 完全不阻塞任何 DML 操作,是真正的“Online”。
  • 對存儲空間沒有額外要求。

三、Online DDL 的鎖機制

即使是 INPLACE 算法,也并非全程無鎖。Online DDL 涉及兩種主要的鎖:

  • SHARED鎖(讀鎖):在 DDL 的準備階段,可能會短暫地獲取。允許其他會話讀,但阻塞寫。
  • EXCLUSIVE鎖(寫鎖/排他鎖):在 DDL 的開始(準備階段)和結束(提交階段)可能會短暫地獲取。此時會阻塞所有其他的讀和寫操作。

關鍵點:Online DDL 的“Online”體現(xiàn)在其耗時的數據拷貝/重建階段(Execute階段)是不鎖表的,而只在元數據變更的瞬間需要短暫的排他鎖。這個瞬間通常非常短,可以忽略不計。

四 關鍵區(qū)別

特性COPYINPLACEINSTANT
核心方式重建整個表原地修改,避免重建整個表僅修改元數據
鎖表時間長 (全程鎖或長寫鎖)短 (準備/提交鎖)極短 (毫秒級元數據鎖)
執(zhí)行階段不允許讀寫允許并發(fā)讀寫允許并發(fā)讀寫
空間占用雙倍表空間額外日志/臨時文件空間幾乎無額外空間
速度中等 (取決于操作復雜度)極快 (毫秒級)
并發(fā)影響高 (停機)低 (短暫阻塞寫)極低 (幾乎無感知)
主要優(yōu)勢兼容性平衡性能和并發(fā)瞬時完成,零感知
典型操作部分無法 INPLACE 的操作 (如刪除主鍵)添加/刪除索引、修改列屬性等添加/刪除列 (有條件)、改默認值

4.1 生動的比喻:給飛行中的飛機換引擎

想象一下,你要給一架正在飛行的飛機更換引擎(這相當于對數據庫表做 ALTER TABLE)。

COPY 算法:讓所有乘客下飛機(阻塞 DML),把飛機拖進機庫,拆下舊引擎,換上新引擎,最后再讓乘客登機。在此期間,飛機完全停運。

INPLACE 算法

  • 準備階段 (Prepare):工程師們做好所有準備工作:新引擎運到機場,所有工具就位。這需要飛機短暫地保持靜止短暫的排他鎖)。
  • 執(zhí)行階段 (Execute)飛機保持飛行狀態(tài)(允許并發(fā) DML)。工程師們掛在機翼上,開始拆卸舊引擎,同時安裝新引擎。乘客們(DML 操作)仍然可以在機艙內正常走動、點餐(INSERTUPDATEDELETE)。
  • 提交階段:新引擎安裝完畢,最后進行一個極其快速的切換和檢查,確保新引擎完全接管工作。這又需要飛機瞬間的靜止短暫的排他鎖)。

4.2 如何指定和查看算法

指定算法: 在 ALTER TABLE 語句中使用 ALGORITHM 子句。

ALTER TABLE your_table ADD COLUMN new_col INT, ALGORITHM=INSTANT; -- 嘗試強制使用 INSTANT
ALTER TABLE your_table ADD INDEX idx_name (col_name), ALGORITHM=INPLACE, LOCK=NONE; -- 嘗試強制 INPLACE 且無鎖
  • ALGORITHM=DEFAULT:讓 MySQL 選擇它認為最高效的可用算法。
  • ALGORITHM=COPY | INPLACE | INSTANT:強制使用特定算法。如果該算法不支持此操作,語句會報錯。

指定鎖策略: 使用 LOCK 子句。

ALTER TABLE ... LOCK=NONE; -- 盡可能允許并發(fā)讀寫 (最高并發(fā))
ALTER TABLE ... LOCK=SHARED; -- 允許讀,阻塞寫
ALTER TABLE ... LOCK=EXCLUSIVE; -- 阻塞讀寫 (傳統(tǒng)方式)
ALTER TABLE ... LOCK=DEFAULT; -- 讓 MySQL 選擇最小必要的鎖策略

指定的 LOCK 級別必須兼容于操作本身支持的級別。例如,一個操作在 INPLACE 執(zhí)行階段允許 LOCK=NONE,但你強制指定 LOCK=EXCLUSIVE 是允許的(雖然不推薦)。反之,如果操作本身在某個階段必須短暫加 EXCLUSIVE 鎖,你指定 LOCK=NONE 會導致語句失敗。

查看算法和鎖: 執(zhí)行 ALTER TABLE 前,使用 ALTER TABLE ... ALGORITHM=INPLACE, LOCK=NONE 并加上 NO_WRITE_TO_BINLOG 和 COMMIT 子句通常不會真正執(zhí)行,MySQL 會檢查并報告它將使用的算法和鎖。更好的方法是查詢 INFORMATION_SCHEMA.INNODB_TABLES 或使用 SHOW CREATE TABLE 觀察進度(對于長時間操作),或者直接執(zhí)行后觀察輸出信息(很多客戶端會顯示使用的算法)。最準確的是查看官方文檔對具體操作的支持矩陣。

4.3 重要注意事項

  • 并非所有 DDL 都是 Online 的: 即使使用 INPLACE 算法,部分操作在準備或提交階段也需要短暫的排他鎖 (EXCLUSIVE)。一些操作(如修改主鍵、修改某些列的數據類型、更改表字符集等)可能仍然需要 COPY 算法或更長時間的鎖。務必查閱官方文檔對應版本的 Online DDL 支持矩陣。
  • 空間與性能: INPLACE 操作雖然避免了重建整個表,但可能涉及大量的數據重組、日志記錄、排序操作,仍然會消耗大量 I/O 和 CPU 資源,可能影響系統(tǒng)性能。INSTANT 操作在這方面開銷最小。
  • 復制: Online DDL 在 MySQL 復制環(huán)境(主從)中的行為也需要考慮。通常在主庫上執(zhí)行的 Online DDL,其效果也會在從庫上以類似的方式應用(可能也是 Online 的,取決于從庫版本和設置)。
  • 元數據鎖 (MDL): 即使算法本身允許并發(fā) DML,長時間的 DDL 操作也可能因為持有 MDL 而阻塞后續(xù)需要獲取沖突 MDL 的其他 DDL 或某些事務。LOCK=NONE 的目標就是最小化 MDL 沖突。
  • INSTANT 的限制: INSTANT 算法雖然強大,但有諸多限制(列的位置、數據類型、索引類型、表格式等),且限制隨版本更新而變化。使用前務必確認操作是否支持 ALGORITHM=INSTANT。
  • 版本差異: Online DDL 的支持程度和具體行為在不同 MySQL 版本(5.6, 5.7, 8.0)和 InnoDB 版本中有顯著差異。強烈建議參考對應版本的官方文檔。

三、總結

MySQL 的 Online DDL 通過 COPYINPLACEINSTANT 三種算法,極大地提升了 DDL 操作的并發(fā)性和可用性。尤其是 INSTANT 算法(MySQL 8.0+)對于支持的列操作實現(xiàn)了近乎瞬時的變更,對在線業(yè)務影響最小。INPLACE 算法則是大多數索引和列操作的主力,在執(zhí)行階段允許并發(fā)讀寫。COPY 算法作為最后的選擇,應盡量避免。

最佳實踐:

  • 優(yōu)先使用 MySQL 8.0+ 以獲得最完善的 INSTANT 支持。
  • 在執(zhí)行 DDL 前,務必查閱官方文檔,明確該操作在你的 MySQL 版本上支持的算法和鎖定行為。
  • 在 ALTER TABLE 語句中顯式指定 ALGORITHM 和 LOCK 子句(如 ALGORITHM=INSTANT, LOCK=NONE),讓 MySQL 在無法滿足要求時報錯,而不是默默使用低效的方式。
  • 對于大表操作,即使使用 INPLACE,也應在業(yè)務低峰期進行,并監(jiān)控服務器資源(I/O, CPU, Memory)。
  • 充分利用 INSTANT 算法進行高頻次的表結構變更(如快速加列)。

到此這篇關于深入理解Mysql OnlineDDL的算法的文章就介紹到這了,更多相關Mysql OnlineDDL 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • 虛擬機Centos7安裝MySQL數據庫實踐

    虛擬機Centos7安裝MySQL數據庫實踐

    用戶分享在虛擬機安裝MySQL的全過程及常見問題解決方案,包括處理GPG密鑰、修改密碼策略、配置遠程訪問權限及防火墻設置,最終通過關閉防火墻和停止NetworkManager解決網絡連接異常問題
    2025-07-07
  • mysql 數據庫鏈接狀態(tài)確認實驗(推薦)

    mysql 數據庫鏈接狀態(tài)確認實驗(推薦)

    這篇文章主要介紹了mysql 數據庫鏈接狀態(tài)確認實驗,通過本文我選擇 了三種方案給大家詳細講解,結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • MySQL CTE (Common Table Expressions)示例全解析

    MySQL CTE (Common Table Expressions)示例全解

    MySQL 8.0引入CTE,支持遞歸查詢,可創(chuàng)建臨時命名結果集,提升復雜查詢的可讀性與維護性,適用于層次結構數據處理,但需注意性能和遞歸深度限制,本文給大家介紹MySQL CTE (Common Table Expressions)示例,感興趣的朋友一起看看吧
    2025-07-07
  • 幾個常見的MySQL的可優(yōu)化點歸納總結

    幾個常見的MySQL的可優(yōu)化點歸納總結

    這篇文章主要介紹了幾個常見的MySQL的可優(yōu)化點歸納總結,包括在編程時處理索引、分頁以及數據類型時可用到的地方,需要的朋友可以參考下
    2015-05-05
  • mysql的group?by使用及多字段分組

    mysql的group?by使用及多字段分組

    Group?By是一種SQL查詢語句,常用于根據一個或多個列對查詢結果進行分組,本文主要介紹了mysql的group?by使用及多字段分組,感興趣的可以了解一下
    2023-09-09
  • MySQL實現(xiàn)Upsert(Update or Insert)功能

    MySQL實現(xiàn)Upsert(Update or Insert)功能

    在數據庫操作中,經常會遇到這樣的需求,當某條記錄不存在時,需要插入一條新的記錄,如果該記錄已經存在,則需要更新這條記錄的某些字段,即Upsert,下面我們就來看看如何在MySQL中實現(xiàn)這一功能
    2025-07-07
  • mysql定時任務(event事件)實現(xiàn)詳解

    mysql定時任務(event事件)實現(xiàn)詳解

    這篇文章主要介紹了mysql定時任務(event事件)實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • MySQL中進行跨庫查詢的方法示例

    MySQL中進行跨庫查詢的方法示例

    這篇文章主要給大家介紹了關于MySQL中進行跨庫查詢的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用MySQL具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-07-07
  • MySQL 常用的拼接語句匯總

    MySQL 常用的拼接語句匯總

    這篇文章主要介紹了MySQL 常用的拼接語句,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-08-08
  • Linux之MySQL主從復制方式

    Linux之MySQL主從復制方式

    本文介紹了MySQL的主從復制原理和配置步驟,包括主從庫的配置、同步操作和異常處理,主從復制通過二進制日志實現(xiàn)數據同步,適用于讀寫分離和備份等場景,配置過程中需要注意server_id的唯一性,確保主從同步的順利進行
    2024-11-11

最新評論

桐梓县| 萝北县| 土默特右旗| 综艺| 阜阳市| 涟源市| 八宿县| 乌恰县| 达拉特旗| 新安县| 贵溪市| 肥东县| 山东省| 裕民县| 柯坪县| 渭源县| 阿图什市| 卢龙县| 聂荣县| 建阳市| 抚远县| 乌恰县| 邹城市| 正镶白旗| 林周县| 潜山县| 石柱| 株洲县| 张家川| 阳东县| 文水县| 新丰县| 手游| 内乡县| 阿克苏市| 周宁县| 武胜县| 康保县| 武穴市| 麦盖提县| 赞皇县|