當前位置: 妍妍網 > 碼農

對線面試官:MySQL 給數據表增加一列,一定會鎖表嗎?

2024-07-08碼農

來源:juejin.cn/post/7303507436759990312

👉 歡迎 ,你將獲得: 專屬的計畫實戰 / 1v1 提問 / Java 學習路線 / 學習打卡 / 每月贈書 / 社群討論

  • 新計畫: 【從零手擼:仿小紅書(微服務架構)】 正在持續爆肝中,基於 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., ;

  • 【從零手擼:前後端分離部落格計畫(全棧開發)】 2期已完結,演示連結: http://116.62.199.48/ ;

  • 截止目前, 累計輸出 49w+ 字,講解圖 2200+ 張,還在持續爆肝中.. 後續還會上新更多計畫,目標是將 Java 領域典型的計畫都整一波,如秒殺系統, 線上商城, IM 即時通訊,Spring Cloud Alibaba 等等,

  • 一、鎖的概念

  • 1.1 鎖的分類

  • 1.2 InnoDB表鎖的特點和使用方式

  • 二、給數據表增加一列,一定會鎖表嗎?

  • 2.1 MySQL 5.6 會不會鎖表

  • 2.2 MySQL 8.0 會不會鎖表

  • 三、總結

  • 如果看到這個標題直接回答會或者不會,哪說明你沒有真正的認識和思考過這個問題!

    註意:以下所有的內容都是基於InnoDB儲存引擎

    一、鎖的概念

    1.1 鎖的分類

    鎖的分類可以從多個方面來劃分。

    圖片

    從對數據操作型別分

  • 讀鎖(共享鎖) : 針對同一份數據,多個讀操作可以同時進行而不會互相影響。

  • 寫鎖(排它鎖) : 當前寫操作沒有完成前,它會阻斷其他寫鎖和讀鎖。

  • 從對數據操作粒度分

  • 表鎖

  • 行鎖

  • 表鎖也是是InnoDB儲存引擎中的一種鎖機制,用於控制對表的並行存取。InnoDB表鎖包括共享鎖(Shared Lock)和排他鎖(Exclusive Lock),用於實作不同程度的並行讀寫操作。嚴格意義上來說,InnoDB儲存引擎沒有MyISAM儲存引擎那種直接的完整的表級鎖。

    1.2 InnoDB表鎖的特點和使用方式

    圖片
  • InnoDB表鎖是自動隱式釘選的,不需要手動指定。

  • InnoDB儲存引擎預設采用行級鎖(Row-Level Locking)而不是表級鎖。這意味著在InnoDB中,釘選的粒度更細,可以同時支持並行讀寫操作,減少了鎖沖突和阻塞的可能性。

  • InnoDB采用多版本並行控制(MVCC)機制,讀取操作不會阻塞寫入操作,寫入操作也不會阻塞讀取操作,提高了並行效能。

  • InnoDB表鎖在事務中使用,並且鎖的持有時間盡可能短,以減少阻塞和沖突的可能性。

  • InnoDB表鎖的具體行為受到事務的隔離級別和釘選模式的影響。透過設定合適的隔離級別和釘選模式,可以平衡並行效能和數據一致性的要求。

  • 二、給數據表增加一列,一定會鎖表嗎?

    在 MySQL 中,使用 InnoDB 儲存引擎給數據表增加一列時,並不一定會鎖表。InnoDB 儲存引擎提供了一些機制來減少對表的釘選,以提高並行效能。

    圖片

    2.1 MySQL 5.6 會不會鎖表

    從 MySQL 5.6 版本開始,InnoDB 引擎引入了線上數據定義語言(DDL)操作,其中包括對表結構的修改。這些線上 DDL 操作允許在不釘選整個表的情況下進行結構更改。具體來說,以下是可能的情況:

  • 對於增加非空列: 在 InnoDB 中,增加非空列時,會執行一個快速的後設資料操作,不會釘選整個表。這意味著在修改期間,其他會話可以繼續讀取和寫入表數據。

  • 對於增加可為空列: 在 InnoDB 中,增加可為空列時,也會執行一個快速的後設資料操作,不會釘選整個表。其他會話可以繼續讀取和寫入表數據,但在修改期間,可能會有一些短暫的行釘選。

  • 註意:盡管 InnoDB 儲存引擎提供了較少的釘選,但在執行 ALTER TABLE 語句時仍可能會有一些效能影響。這可能是由於內部的後設資料操作、數據重組或日誌寫入等引起的。

    因此,在對大型表進行結構修改時,仍建議在低負載時執行,以最小化對應用程式的影響。

    針對上面的問題,MySQL8.0做了更多的最佳化和升級

    2.2 MySQL 8.0 會不會鎖表

    MySQL 8.0 在處理大數據表增加欄位的情況下進行了一些最佳化,進一步最佳化了減少對表的釘選時間和降低效能影響。在MySQL8.0中,還引入了 Invisible Indexes Instant DDL In-Place Alter 升級等新功能,可以進一步提高MySQL的效能和可維護性。

  • 原子 DDL: MySQL 8.0 引入了原子 DDL(Atomic DDL)操作,這意味著 ALTER TABLE 語句的執行過程中將會有更少的阻塞。在增加欄位的情況下,原子 DDL 機制可以減少對表的釘選時間,並允許其他會話繼續讀取和寫入數據。

  • 立即更新後設資料: MySQL 8.0 在增加欄位時立即更新表的後設資料,而不需要等待整個操作完成。這樣可以更快地完成 ALTER TABLE 操作,並減少對表的釘選時間。

  • InnoDB 引擎最佳化: MySQL 8.0 的 InnoDB 儲存引擎針對大數據表的結構修改進行了一些最佳化。例如,對於增加非空欄位,InnoDB 不再需要復制整個表的數據。相反,它會使用一種更輕量級的操作來添加新欄位,從而減少釘選時間和資源消耗。

  • 增量後設資料更新: MySQL 8.0 引入了增量後設資料更新,這意味著在 ALTER TABLE 操作期間只需更新受影響的後設資料資訊,而不是整個表。這樣可以減少釘選時間和操作的開銷。

  • 三、總結

    總結上面的所有內容,實際就是單純的增加一個欄位,表結構修改和索引添加通常不會釘選整個表,在某些情況下,MySQL可能需要釘選整個表。同時數據量過大的時候,會出現一些效能問題,所以我們實際操作的過程中,一定要關註表的數據多小,最終的數據大小(這裏要關註索引數據)。

    👉 歡迎 ,你將獲得: 專屬的計畫實戰 / 1v1 提問 / Java 學習路線 / 學習打卡 / 每月贈書 / 社群討論

  • 新計畫: 【從零手擼:仿小紅書(微服務架構)】 正在持續爆肝中,基於 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., ;

  • 【從零手擼:前後端分離部落格計畫(全棧開發)】 2期已完結,演示連結: http://116.62.199.48/ ;

  • 截止目前, 累計輸出 49w+ 字,講解圖 2200+ 張,還在持續爆肝中.. 後續還會上新更多計畫,目標是將 Java 領域典型的計畫都整一波,如秒殺系統, 線上商城, IM 即時通訊,Spring Cloud Alibaba 等等,


    1. 

    2. 

    3. 

    4. 

    最近面試BAT,整理一份面試資料Java面試BATJ通關手冊,覆蓋了Java核心技術、JVM、Java並行、SSM、微服務、資料庫、數據結構等等。

    獲取方式:點「在看」,關註公眾號並回復 Java 領取,更多內容陸續奉上。

    PS:因公眾號平台更改了推播規則,如果不想錯過內容,記得讀完點一下在看,加個星標,這樣每次新文章推播才會第一時間出現在你的訂閱列表裏。

    「在看」支持小哈呀,謝謝啦