mysql新增列并同時增加數據_圖解MySQL | [原理解析] MySQL 為表添加列 是怎么quot;立刻quot;完成的...

在上一期圖解?圖解MySQL | MySQL DDL為什么成本高?中,我們介紹了:

  • 傳統情況下,為表添加列需要對表進行重建

  • 騰訊團隊為 MySQL 引入了 Instant Add Column 的方案(以下稱為 "立刻加列" 功能)可以快速完成 為表添加列 的任務

同時我們留了以下思考題:

  • "立刻加列" 是如何工作的 ?

  • 所謂 "立刻加列" 是否完全不影響業務,是否是真正的 "立刻" 完成 ?

本期我們針對這幾個問題來進行討論:

傳統情況

我們先回顧一下,在沒有 "立刻加列" 功能時,加列操作是怎么完成的。我們也借此來熟悉一下本期的圖例:

86ccc9255a83454a8d5a2c11195ddb24.png

  • 當進行 加列操作 時,所有的數據行 都必須要 增加一段數據(圖中的 列 4 數據)

  • 如上一期圖解所講,當改變數據行的長度,就需要 重建表空間(圖中灰藍的部分為發生變更的部分)

  • 數據字典中的列定義也會被更新

以上操作的問題在于 每次加列 操作都需要重建表空間,這就需要大量 IO以及大量的時間


立刻加列

"立刻加列" 的過程如下圖:

6aafa72bb6a7335d0c5cc7a8944d8f88.png

  • "立刻加列" 時,只會變更數據字典中的內容,包括:

    • 列定義中增加 新列的定義

    • 增加 新列的默認值

  • "立刻加列"?后,當要讀取表中的數據時:

    • 由于 "立刻加列" 沒有 變更行數據,讀取的行數據只有 3 列

    • MySQL 會將 新增的第 4 列的默認值,追加到 讀取的數據后

以上過程描述了 如何讀取 在 "立刻加列" 之前寫入的數據,其實質是:在讀取數據的過程中,"偽造"?了一個新列出來

那么如何讀取 在 "立刻加列" 之后 寫入的數據呢 ? 過程如下圖:

660ec61b63f41e6d4ddb9ba0e5812bdf.png

當讀取 行 4 時:

  • 通過判斷 數據行的頭信息中的instant 標志位,可以知道該行的格式是 "新格式":該行頭信息后有一個新字段 "列數"

  • 通過讀取?數據行的 "列數" 字段,可以知道 該行數據中多少列有 "真實" 的數據,從而按列數讀取數據

通過上圖可以看到:讀取?在"立刻加列"?前/后寫入的數據是不同的流程

通過以上的討論,我們可以總結 "立刻加列" 之所以高效的原因是:

  1. 在執行 "立刻加列" 時,不變更數據行的結構

  2. 讀取 "舊" 數據時,"偽造"?新增的列,使結果正確

  3. 寫入 "新" 數據時,使用了新的數據格式(增加了instant標志位 和 "列數" 字段),以區分新舊數據

  4. 讀取 "新" 數據時,可以如實讀取數據

那么?我們是否能一直 "偽造" 下去???"偽造" 何時會被拆穿 ?

考慮以下場景:

  1. 用 "立刻加列" 增加列 A

  2. 寫入數據行 1

  3. 用 "立刻加列" 增加列?B

  4. 寫入數據行?2

  5. 刪除列?B

我們推測一下 "刪除列 B" 的最小代價:需要修改 數據行中的instant標志位或 "列數" 字段,這至少會影響到?"立刻加列" 之后寫入的數據行,成本類似于重建數據

從以上推測可知:當出現 與 "立刻加列" 操作不兼容 的 DDL 操作時,數據表需要進行重建如下圖所示:

edfad06bff4bafe2e897d84db0341fd7.png

擴展思考題:是否能設計其他的數據格式,取代instant標志位和 "列數" 字段,使得 加列/刪列 操作都能 "立刻完成" ?(提示:考慮 加列?- 刪列?- 再加列 的情況)


使用限制

在了解原理之后,我們來看看 "立刻加列" 的使用限制,就很容易能理解其中的前兩項:

  1. "立刻加列"?的加列位置只能在表的最后,而不能加在其他列之間在元數據中,只記錄了 數據行 應有多少列,而沒有記錄 這些列 應出現的位置。所以無法實現指定列的位置

  2. "立刻加列"?不能添加主鍵列加列 不能涉及聚簇索引的變更,否則就變成了 "重建" 操作,不是 "立刻" 完成了

  3. "立刻加列"不支持壓縮的表格式
    按照 WL 的說法:"COMPRESSED is no need to supported"(沒必要支持不怎么用的格式)

總結回顧

我們總結一下上面的討論:

  1. "立刻加列" 之所以高效的原因是:

    1. 在執行 "立刻加列" 時,不變更數據行的結構

    2. 讀取 "舊" 數據時,"偽造"?新增的列,使結果正確

    3. 寫入 "新" 數據時,使用了新的數據格式?(增加了?instant 標志位?和 "列數" 字段),以區分新舊數據

    4. 讀取 "新" 數據時,可以如實讀取數據

  2. "立刻加列"?的 "偽造" 手法,不能一直維持下去。當發生?與 "立刻加列" 操作不兼容 的 DDL?時,表數據就會發生重建

回到之前遺留的兩個問題:

  • "立刻加列" 是如何工作的 ?

    我們已經解答了這個問題

  • 所謂 "立刻加列" 是否完全不影響業務,是否是真正的 "立刻" 完成 ?

    可以看到:就算是 "立刻加列",也需要變更 數據字典,那么 該上的鎖還是逃不掉的。也就是說 這里的 "立刻" 指的是 "不變更數據行的結構",而并非指 "零成本地完成任務"

本期仍然留下一個思考題:

  • 本文中描述了?在 "立刻加列" 之后?插入?數據行的情況?(數據行會使用新格式)。那么在 "立刻加列" 之后 更新?數據行會發生什么情況呢??


5c600241952e3f5f9bbf9a0f499a6675.png圖解MySQL原理

圖解MySQL | MySQL DDL為什么成本高?

圖解MySQL?|?[原理解析]?XtraBackup增量備份還原

[原理解析]?XtraBackup全量備份還原

[原理解析]?MySQL使用固定的server_id導致數據丟失

[原理解析]?MySQL組提交(group?commit)

[原理解析]?設置字符集的參數控制了哪些行為

1916a6e3c8ecd2c7382f01228cae2cd0.gif

近期社區動態

第三期 社區技術內容征稿?

所有稿件,一經采用,均會為作者署名。

征稿主題:MySQL、分布式中間件DBLE、數據傳輸組件DTLE相關的技術內容

活動時間:2019年6月11日 - 7月11日

本期投稿獎勵

投稿成功:京東卡200元*1

優秀稿件:京東卡200元*1+社區定制周邊(包含:定制文化衫、定制傘、鼠標墊)

優秀稿件評選,文章獲得“好看數量排名前三的稿件為本期優秀稿件。

09fa8fc94ca4c67beb884868309bdece.pngf4e2ea96874d4251fd6afc01102970fc.gif

喜歡點分享”,不行就看”

7a28ead373b833841eac2c442415feeb.gif

多喝熱水,重啟試試

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454106.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454106.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GCC for Win32開發環境介紹

GCC for Win32開發環境介紹(1) 第一章 在視窗操作系統下的GCC 第一節GCC家族概覽 GCC是一個原本用于Unix-like系統下編程的編譯器。不過,現在GCC也有了許多Win32下的移植版本。所以,也許對于許多Windows開發者來說,GCC還是一個比較陌生的東西…

包裝函數

function wrap(object,method,wrapper){ //object:包裝方法所屬對象 method:方法名 wrapper:替換函數var fn object[method];return object[method] function(){return wrapper.apply(this,[fn.bind(this)].concat(Array.prototype.slice.call(arguments)));}; } 轉載于…

JAR——pinyin4j-2.5.0

簡介:將中文轉為拼音; 使用: 123//返回的是字符串String pinyin[] PinyinHelper.toHanyuPinyinStringArray(chinese);//eg:你----ni3本文轉自wauoen51CTO博客,原文鏈接:http://blog.51cto.com/7183397/1605894&#…

Android高效加載大圖、多圖解決方案,有效避免程序OOM

http://blog.csdn.net/guolin_blog/article/details/9316683轉載于:https://www.cnblogs.com/jianglijs/p/7827524.html

Flask 上下文源碼解析

簡單來說,上下文包括request_ctx(封裝了request和session),app_request(封裝了app和g),兩個ctx都儲存在一個叫做Local的數據結構中,這個結構的作用就是會自動根據不同的線程id返回對應的數據,然后通過一個叫做 LocalStark 的結構把…

reg型變量怎么賦值_UiPath變量介紹和使用

1 變量變量主要用于存儲數據,它在RPA中扮演重要的數據傳遞角色,是RPA編程不可或缺的一部分。它包括變量名稱和變量的值,變量的值支持多種數據類型,包括從通用值,文本,數字,數據表,時…

gcc 使用教程

gcc 使用教程 目 錄 gcc makefile寫法 gcc_egcs使用 gdb使用 gcc常用選項對代碼的影響 一般情況 -O 編譯選項 -O2 編譯選項 -fomit-frame-pointer 編譯選項-fomit-frame-pointer && -O2-fPIC 編譯選項 -static 編譯選項 AT&T的匯編格式 x86內聯匯編 簡述 內聯匯編…

Struts2教程9:實現自已的攔截器

在上一篇中介紹了Struts2攔截器的原理,在這一篇中我們將學習一下如何編寫自己的攔截器。一、攔截器的實現實現一個攔截器非常簡單。實際上,一個攔截器就是一個普通的類,只是這個類必須實現com.opensymphony.xwork2.interceptor.Interceptor接…

標準C程序設計七---66

Linux應用 編程深入 語言編程標準C程序設計七---經典C11程序設計 以下內容為閱讀: 《標準C程序設計》(第7版) 作者:E. Balagurusamy(印), 李周芳譯 清華大學出版社…

深度學習之概述

深度學習的應用場景 1、圖像應用: 1.1 大規模(大數據量)圖片識別(聚類/分類),如人臉識別,車牌識別,OCR等。人臉識別算法:① faceID ② faceNet 1.2 以圖搜圖,圖像分割 1.3 目標檢測&#xff0…

如何根據對象獲取到對應的表名_Excel VBA 常用對象二

下面繼續講解上一節中未講完的內容:Excel VBA編程中常常使用的那些對象到底是什么,如何在代碼中表示它們。Worksheet對象Worksheet對象代表工作表。工作簿中的每個工作表都是一個Worksheet對象,所有Worksheet對象構成了Worksheets集合。我們使…

PIX525故障一例,求解

IDC機房網絡拓樸如下:IDC核心交換機-----通過一條網線-------機柜D-LNKI交換機------PIX 525------CISCO交換機------各WEB服務器。其中D-LINK交換機的IP為192.168.2.11,也就是下面日志中的IP。另外,之所以IDC和PIX之間再加一臺DLINK是因為有…

gcc教程(轉)

gcc 目 錄 gcc makefile寫法 gcc_egcs使用 gdb使用 gcc常用選項對代碼的影響 一般情況 -O 編譯選項 -O2 編譯選項 -fomit-frame-pointer 編譯選項 -fomit-frame-pointer && -O2 -fPIC 編譯選項 -static 編譯選項 AT&T的匯編格式 x86內聯匯編 簡述 內聯匯編 程序模…

深度學習之 BP 算法

神經網絡的一種求解W的算法,分為信號“正向傳播(FP)”求損失,“反向傳播(BP)”回傳誤差;根據誤差值修改每層的權重,繼續迭代。 BP算法也叫做δ算法。以三層的感知器為例(假定現在隱層和輸出層均存在相同類型的激活函數…

python自帶的解釋器叫做_python學習

一、PYTHON中的元素1.基本元素運算符: - * / %等等除法:" / " 表示浮點數除法,返回浮點結果;" // " 表示整數除法,返回不大于結果的一個最大的整數運算順序:先乘除 再加減 括號最優先變量:就是一…

IE打印空白

今天碰到HR經理碰到一個問題,就是windows 7 64位操作系統,但是打印空白,打印出來像白紙一樣!經過查看和總結,確認是:由于保護模式下 %Temp%\Low 文件夾工作不正常引起的!故障打印白紙下面會出現…

Python Matplotlib.plot Update image Questions

1. 最近在測試一款設備,采集了一些設備后需要一幀一幀顯示圖像,經常使用Python,所以選用了Matplotlib進行圖像操作 數據結構: timesatamp polar_distance horizontal_angle refelectivity_intensity,所有數據類型都是 float,儲存在…

深度學習之 RBF神經網絡

RBF神經網絡通常只有三層,即輸入層、中間層和輸出層。其中中間層主要計算輸入x和樣本矢量c(記憶樣本)之間的歐式距離的Radial Basis Function (RBF)的值,輸出層對其做一個線性的組合。 徑向基函數: RBF神經網絡的訓練…

redis 隊列_Redis與Rabbitmq消息隊列的區別

將redis發布訂閱模式用做消息隊列和rabbitmq的區別:可靠性 redis :沒有相應的機制保證消息的可靠消費,如果發布者發布一條消息,而沒有對應的訂閱者的話,這條消息將丟失,不會存在內存中;rabbit…

EasyUI中那些不容易被發現的坑——EasyUI重復請求2次的問題

問題控件:datagrid、combobox、所有能設置url屬性的控件 問題版本:1.4.4、1.4.5(之前的版本沒測) 問題如圖: 重復請求2次,錯誤代碼如圖: 錯誤問題分析:html加載的時候回請求url加載數…