mysql中添加一列數據庫嗎(數據庫怎麼添加一列數據)

本文目錄一覽:

想在mysql數據庫中的表中插入一列,怎麼做?

傳統情況

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

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

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

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

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

立刻加列

“立刻加列” 的過程如下圖:

請點擊輸入圖片描述

請點擊輸入圖片描述

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

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

增加 新列的默認值

“立刻加列” 後,當要讀取表中的數據時:

由於 “立刻加列” 沒有 變更行數據,讀取的行數據只有 3 列

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

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

那麼如何讀取 在 “立刻加列” 之後 寫入的數據呢 ? 過程如下圖:

當讀取 行 4 時:

請點擊輸入圖片描述

請點擊輸入圖片描述

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

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

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

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

在執行 “立刻加列” 時,不變更數據行的結構

讀取 “舊” 數據時,”偽造” 新增的列,使結果正確

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

讀取 “新” 數據時,可以如實讀取數據

那麼 我們是否能一直 “偽造” 下去 ? “偽造” 何時會被拆穿 ?

考慮以下場景:

用 “立刻加列” 增加列 A

寫入數據行 1

用 “立刻加列” 增加列 B

寫入數據行 2

刪除列 B

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

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

請點擊輸入圖片描述

請點擊輸入圖片描述

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

使用限制

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

“立刻加列” 的加列位置只能在表的最後,而不能加在其他列之間

在元數據中,只記錄了 數據行 應有多少列,而沒有記錄 這些列 應出現的位置。所以無法實現指定列的位置

“立刻加列” 不能添加主鍵列

加列 不能涉及聚簇索引的變更,否則就變成了 “重建” 操作,不是 “立刻” 完成了

“立刻加列”不支持壓縮的表格式

按照 WL 的說法:”COMPRESSED is no need to supported”(沒必要支持不怎麼用的格式)

總結回顧

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

“立刻加列” 之所以高效的原因是:

在執行 “立刻加列” 時,不變更數據行的結構

讀取 “舊” 數據時,”偽造” 新增的列,使結果正確

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

讀取 “新” 數據時,可以如實讀取數據

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

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

“立刻加列” 是如何工作的 ?

我們已經解答了這個問題

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

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

MySQL 數據庫如何添加列

傳統情況

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

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

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

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

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

立刻加列

“立刻加列” 的過程如下圖:

請點擊輸入圖片描述

請點擊輸入圖片描述

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

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

增加 新列的默認值

“立刻加列” 後,當要讀取表中的數據時:

由於 “立刻加列” 沒有 變更行數據,讀取的行數據只有 3 列

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

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

那麼如何讀取 在 “立刻加列” 之後 寫入的數據呢 ? 過程如下圖:

當讀取 行 4 時:

請點擊輸入圖片描述

請點擊輸入圖片描述

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

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

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

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

在執行 “立刻加列” 時,不變更數據行的結構

讀取 “舊” 數據時,”偽造” 新增的列,使結果正確

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

讀取 “新” 數據時,可以如實讀取數據

那麼 我們是否能一直 “偽造” 下去 ? “偽造” 何時會被拆穿 ?

考慮以下場景:

用 “立刻加列” 增加列 A

寫入數據行 1

用 “立刻加列” 增加列 B

寫入數據行 2

刪除列 B

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

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

請點擊輸入圖片描述

請點擊輸入圖片描述

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

使用限制

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

“立刻加列” 的加列位置只能在表的最後,而不能加在其他列之間

在元數據中,只記錄了 數據行 應有多少列,而沒有記錄 這些列 應出現的位置。所以無法實現指定列的位置

“立刻加列” 不能添加主鍵列

加列 不能涉及聚簇索引的變更,否則就變成了 “重建” 操作,不是 “立刻” 完成了

“立刻加列”不支持壓縮的表格式

按照 WL 的說法:”COMPRESSED is no need to supported”(沒必要支持不怎麼用的格式)

總結回顧

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

“立刻加列” 之所以高效的原因是:

在執行 “立刻加列” 時,不變更數據行的結構

讀取 “舊” 數據時,”偽造” 新增的列,使結果正確

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

讀取 “新” 數據時,可以如實讀取數據

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

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

“立刻加列” 是如何工作的 ?

我們已經解答了這個問題

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

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

MySQL 數據庫如何添加列??

傳統情況

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

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

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

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

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

立刻加列

“立刻加列” 的過程如下圖:

請點擊輸入圖片描述

請點擊輸入圖片描述

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

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

增加 新列的默認值

“立刻加列” 後,當要讀取表中的數據時:

由於 “立刻加列” 沒有 變更行數據,讀取的行數據只有 3 列

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

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

那麼如何讀取 在 “立刻加列” 之後 寫入的數據呢 ? 過程如下圖:

當讀取 行 4 時:

請點擊輸入圖片描述

請點擊輸入圖片描述

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

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

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

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

在執行 “立刻加列” 時,不變更數據行的結構

讀取 “舊” 數據時,”偽造” 新增的列,使結果正確

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

讀取 “新” 數據時,可以如實讀取數據

那麼 我們是否能一直 “偽造” 下去 ? “偽造” 何時會被拆穿 ?

考慮以下場景:

用 “立刻加列” 增加列 A

寫入數據行 1

用 “立刻加列” 增加列 B

寫入數據行 2

刪除列 B

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

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

請點擊輸入圖片描述

請點擊輸入圖片描述

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

使用限制

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

“立刻加列” 的加列位置只能在表的最後,而不能加在其他列之間

在元數據中,只記錄了 數據行 應有多少列,而沒有記錄 這些列 應出現的位置。所以無法實現指定列的位置

“立刻加列” 不能添加主鍵列

加列 不能涉及聚簇索引的變更,否則就變成了 “重建” 操作,不是 “立刻” 完成了

“立刻加列”不支持壓縮的表格式

按照 WL 的說法:”COMPRESSED is no need to supported”(沒必要支持不怎麼用的格式)

總結回顧

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

“立刻加列” 之所以高效的原因是:

在執行 “立刻加列” 時,不變更數據行的結構

讀取 “舊” 數據時,”偽造” 新增的列,使結果正確

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

讀取 “新” 數據時,可以如實讀取數據

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

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

“立刻加列” 是如何工作的 ?

我們已經解答了這個問題

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

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

原創文章,作者:VWCZM,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/329648.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VWCZM的頭像VWCZM
上一篇 2025-01-14 18:55
下一篇 2025-01-14 18:55

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Python爬取公交數據

    本文將從以下幾個方面詳細闡述python爬取公交數據的方法: 一、準備工作 1、安裝相關庫 import requests from bs4 import BeautifulSou…

    編程 2025-04-29
  • Python兩張表數據匹配

    本篇文章將詳細闡述如何使用Python將兩張表格中的數據匹配。以下是具體的解決方法。 一、數據匹配的概念 在生活和工作中,我們常常需要對多組數據進行比對和匹配。在數據量較小的情況下…

    編程 2025-04-29
  • Python數據標準差標準化

    本文將為大家詳細講述Python中的數據標準差標準化,以及涉及到的相關知識。 一、什麼是數據標準差標準化 數據標準差標準化是數據處理中的一種方法,通過對數據進行標準差標準化可以將不…

    編程 2025-04-29

發表回復

登錄後才能評論