MySQL Online DDL與DML併發阻塞關係總結

来源:https://www.cnblogs.com/wy123/archive/2019/11/05/11798261.html
-Advertisement-
Play Games

MySQL DDL操作執行的三種方式 1,INPLACE,在進行DDL操作時,不影響表的讀&寫,可以正常執行表上的DML操作,避免與COPY方法相關的磁碟I/O和CPU周期,從而最小化資料庫的總體負載。 最小化負載有助於在DDL操作期間保持良好的性能和高吞吐量。 2,COPY,不允許併發執行過多個D ...


MySQL DDL操作執行的三種方式 1,INPLACE,在進行DDL操作時,不影響表的讀&寫,可以正常執行表上的DML操作,避免與COPY方法相關的磁碟I/O和CPU周期,從而最小化資料庫的總體負載。 最小化負載有助於在DDL操作期間保持良好的性能和高吞吐量。 2,COPY,不允許併發執行過多個DDL,執行過程中表不允許寫但可讀。 過程是通過創建一個新結構的臨時表,將數據copy到臨時表,完成後刪除原表,重命名新表的方式,需要拷貝原始表, 3,INSTANT,從 MySQL 8.0.12 開始被引入並預設使用。目前 INSTANT 演算法只支持增加列等少量 DDL 類型的操作,其他類型仍然會預設使用 INPLACE。
以下是MySQL 5.7版本中各種DDL操作的執行方式,總結一下: 1,如果DDL的執行方式是InPlace = YES ,那麼改DDL的執行會支持併發DML,不會影響表的增刪查改,
  1.1,如果DDL的執行方式是InPlace = YES &  Rebuilds Table = No,那麼Only Modifies Metadata一定為Yes,也即僅僅修改元數據,類似於INSTANT    1.2,如果DDL的執行方式是InPlace = YES  & Rebuilds Table = Yes,那麼Only Modifies Metadata一定為No,需要考慮Rebuilds Table對IO和CPU等資源的消耗 2,如果DDL的執行方式是InPlace = NO,那麼改DDL的執行期間表只讀,阻塞寫(增刪改),同時需要考慮對IO和CPU等資源的消耗 3,如果是INSTANT方式,類似於1.1   如下,對於執行期間不支持併發DML的操作,標記了出來,如果不是影響併發DML的操作,就不需要考慮第三方工具了,只需要考慮IO和CPU等資源的消耗。
因為用第三方工具同樣需要消耗IO以及CPU等資源。
正常來說操作,修改欄位數據類型,以及增加衍生列,修改衍生列欄位順序這三種,以及多數分區相關的操作的同時,不支持併發DML,其他DDL執行時都支持併發DML。   索引操作
CREATE INDEX name ON table (col_list);(ALTER TABLE tbl_name ADD INDEX name (col_list);)
DROP INDEX name ON table;(ALTER TABLE tbl_name DROP INDEX name;)
ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name, ALGORITHM=INPLACE, LOCK=NONE;
CREATE FULLTEXT INDEX name ON table(column);
CREATE TABLE geom (g GEOMETRY NOT NULL);ALTER TABLE geom ADD SPATIAL INDEX(g), ALGORITHM=INPLACE, LOCK=SHARED;
ALTER TABLE tbl_name DROP INDEX i1, ADD INDEX i1(key_part,...) USING BTREE, ALGORITHM=INPLACE;
  主鍵操作
ALTER TABLE tbl_name ADD PRIMARY KEY (column)
ALTER TABLE tbl_name DROP PRIMARY KEY
ALTER TABLE tbl_name DROP PRIMARY KEY, ADD PRIMARY KEY (column)

列操作

ALTER TABLE tbl_name ADD COLUMN column_name column_definition,
ALTER TABLE tbl_name DROP COLUMN column_name
ALTER TABLE tbl CHANGE old_col_name new_col_name data_type
ALTER TABLE tbl_name MODIFY COLUMN col_name column_definition FIRST
ALTER TABLE tbl_name CHANGE c1 c1 BIGINT
ALTER TABLE tbl_name CHANGE COLUMN c1 c1 VARCHAR(255)
ALTER TABLE tbl_name ALTER COLUMN col SET DEFAULT literal
ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT
ALTER TABLE table AUTO_INCREMENT=next_value
ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NULL
ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NOT NULL
ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd')
  衍生列(generated column)操作
ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED)
ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED FIRST
ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL)
ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL FIRST
ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE
  外鍵操作
ALTER TABLE tbl1 ADD CONSTRAINT fk_name FOREIGN KEY index (col1)REFERENCES tbl2(col2) referential_actions;
ALTER TABLE tbl DROP FOREIGN KEY fk_name;
  表操作
ALTER TABLE tbl_name ROW_FORMAT = row_format
ALTER TABLE tbl_name KEY_BLOCK_SIZE = value
ALTER TABLE tbl_name STATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl_name CHARACTER SET = charset_name, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name, ALGORITHM=COPY;
OPTIMIZE TABLE tbl_name;
ALTER TABLE tbl_name FORCE, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE old_tbl_name RENAME TO new_tbl_name, ALGORITHM=INPLACE, LOCK=NONE;
  表空間操作
ALTER TABLE tbl_name ENCRYPTION='Y', ALGORITHM=COPY;

 

分區操作

 

    參考: https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html https://dbaplus.cn/news-11-2552-1.html    
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 說來和MySQL倒是有緣,畢業的第一份工作就被分配到了RDS團隊,主要負責把MySQL弄到雲上做成資料庫服務。雖說整天和MySQL打交道,但說實話那段時間並沒有很深入的理解MySQL內核,做的事情基本都是圍繞著MySQL做管控系統,比較上層。好在周邊都是MySQL內核神級人物,在他們的熏陶下多多少少 ...
  • 初次使用redis時,在鏈接Redis後,運行報錯“No module named redis”。 具體代碼如下: import redis r = redis.Redis(host='192.168.2.22',port=6379,db=2) r.set('name','Delia') print ...
  • mysql不支持全連接,但可以通過左外連接+ union+右外連接實現 ...
  • 1、什麼是mysql主從同步? 當master(主)庫的數據發生變化的時候,變化會實時的同步到slave(從)庫。 2、主從同步有什麼好處? 水平擴展資料庫的負載能力。 容錯,高可用。Failover(失敗切換)/High Availability 數據備份。 3、主從同步的原理是什麼? 首先我們來 ...
  • 今天用mysql執行了一個60M的SQL腳本遇到了一些錯誤,經由網上查詢如下: 1.#2006 - MySQL server has gone away 出現該錯誤代碼原因如下: 1、應用程式長時間的執行批量的MySQL語句。 2、執行一個SQL,但SQL語句過大或者語句中含有BLOB或者longb ...
  • Made By Herolh 目錄 { index} [TOC] 一、MySQL是什麼: 服務端 客戶端 Mysql資料庫 Mysql是最流行的關係型資料庫管理系統,在 WEB 應用方面MySQL是最好的RDBMS(Relational Database Management System:關係數據 ...
  • 在資料庫的增刪改查操作中,使用最頻繁的就是查詢操作。 而在所有查詢操作中,統計數量操作更是經常被用到。 關於資料庫中行數統計,無論是MySQL還是Oracle亦或者是SqlServer,都有一個函數可以使用,那就是COUNT。 而對於COUNT,有幾個問題很值得去思考: 1、COUNT有幾種用法? ...
  • 1:安裝 去mongodb的官網http://www.mongodb.org/downloads下載32bit的包 解壓後會出現以下文件 在安裝的盤C:下建立mongodb文件夾,拷貝bin文件夾到該目錄下,這樣就相當於安裝了mongodb的相關命令。 為了啟動mongodb方便,將mongod.e ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...