MySQL深度解析 資料的刪除與重建表

2021-10-25 08:01:56 字數 1629 閱讀 5794

資料頁的復用和記錄的復用是不同的

刪除資料或者插入資料會造成資料空洞

也就是說,經過大量增刪改的表,都是可能是存在空洞的。所以,如果能夠把這些空洞去掉,就能達到收縮表空間的目的。

# 5.6版本前,不是online的,重建表與對該錶的增刪改查不能同時進行。

alter

table a engine

=innodb

online ddl

mysql在5.6以後引入的online ddl,對alter table操作流程做了優化

online ddl重建表的流程:

建立乙個臨時檔案,掃瞄表a主鍵的所有資料頁;

用資料頁中表a的記錄生成b+樹,儲存到臨時檔案中;

生成臨時檔案的過程中,將所有對a的操作記錄在乙個日誌檔案(row log)中,對應的是圖中state2的狀態;

臨時檔案生成後,將日誌檔案中的操作應用到臨時檔案,得到乙個邏輯資料上與表a相同的資料檔案,對應的就是圖中state3的狀態;

用臨時檔案替換表a的資料檔案。

alter語句執行時會獲取mdl寫鎖,但是在真正的拷貝之前,為了不影響增刪改查寫鎖會退化成mdl讀鎖。

ps:重建表推薦使用github開源的gh-ost來做。

inplacecopy的區別:

#alter table t engine=innodb 相當於下面的語句

alter

table t engine

=innodb

,algorithm

=inplace;

# 與inplace對應的就是copy

alter

table t engine

=innodb

,algorithm

=copy;

onlineinplace之間的關係:

ddl過程如果是online的,就一定是inplace的;

反過來未必,也就是說inplace的ddl,有可能不是online的。截止到mysql 8.0,新增全文索引(fulltext index)和空間索引(spatial index)就屬於這種情況。

alter table t engine = innodb也就是recreate,詳見上文。

analyze table t其實不是重建表,只是對錶的索引資訊做重新統計,沒有修改資料,這個過程中加了mdl讀鎖;

optimize table t等於recreate+analyze

深度解析mysql登入原理

使用mysql資料庫的第一步必然是建立連線登入,然後在上面執行sql命令。無論是通過mysql的客戶端,還是通過c api,jdbc標準介面連線資料庫,這個過程一定少不了。今天我們聊一聊mysql登陸具體過程,裡面會涉及client與server的互動,並通過tcpdump抓包給大家展現這一過程。t...

mysql解析資料 解析資料儲存MySQL

為了適應不同專案對不同感興趣屬性的解析儲存,資料儲存結構採用縱向的屬性列表方式,即乙個url頁面多個屬性儲存多條記錄方式,並且按照text,html,data,num幾大典型型別分別對應儲存。create table crawl data url varchar 255 not null,code ...

非同步與執行緒深度解析

注 一般人們都把非同步與同步做比較,今天我們把非同步與執行緒做比較。請大家多多指教 批評。最近用c framework 2.0 寫了乙個系統,這個系統用了很多非同步和執行緒。當我用異常或執行緒操作 更新控制項資訊的時候會提示乙個異常資訊 執行緒間操作無效,從不是建立控制項的執行緒訪問控制項 以前用也...