Mysql InnoDB 底層架構設計、功能、原理、源碼系列合集【四、事務引擎核心 - MVCC與鎖機制】

Mysql InnoDB 底層架構設計、功能、原理、源碼系列合集

一、InnoDB 架構先導。【模塊劃分,各模塊功能、源碼位置、關鍵結構體/函數】

二、內存結構核心 - 緩沖池與性能加速器

三、日志系統 - 事務持久化的基石

四、事務引擎核心 - MVCC與鎖機制

五、InnoDB 高階機制與實戰調優

六、架構全景圖與最佳實踐


前言

InnoDB作為MySQL的默認事務型存儲引擎,其核心并發控制機制由MVCC(多版本并發控制)和鎖系統共同構成。這兩者相互配合,既保證了事務的隔離性與一致性,又提高了系統的并發性能。本文將從Undo Log與回滾段結構、MVCC實現原理、鎖系統工作機制三個維度,深入剖析InnoDB事務引擎的核心設計與實現細節,幫助讀者全面理解這一工業級存儲引擎的并發控制機制。

一、Undo Log與回滾段

1.1 Undo Log結構與作用

Undo Log是InnoDB實現事務原子性和MVCC的核心數據結構。它采用邏輯日志形式,記錄數據修改前的"前映像"(before image),而非物理頁的修改。這種設計使得回滾操作更為高效,也便于構建多版本數據鏈。
每條記錄在InnoDB中包含三個隱藏字段:

  • DB_TRX_ID:記錄該行最新一次被修改的事務ID
  • DB_ROLL_ptr:回滾指針,指向該行在Undo Log中的上一個版本
  • DB_row_ID:隱藏的行ID,用于聚簇索引組織
    這些隱藏字段與Undo Log共同構成了多版本數據鏈。當事務修改數據時,會先將原數據寫入Undo Log,然后修改當前數據。通過DB_ROLL_ptr,可以回溯到歷史版本,實現事務的回滾和MVCC的版本控制。

1.2 回滾段物理結構

回滾段(Rollback Segment)是管理Undo Log的元數據結構。在InnoDB中,回滾段采用以下物理結構:

  1. 表空間組織:Undo Log存儲在專門的undo tablespace中,由多個段(segment)組成。每個段由64個頁 extent構成,頁大小通常為16KB。
  2. 頁結構:Undo頁包含多個undo記錄,每個記錄對應一個事務的修改操作。頁分為兩種類型:
    • Insert undo頁:僅用于回滾未提交的INSERT操作,在事務提交后可以立即釋放
    • Update undo頁:用于回滾UPDATE和DELETE操作,需要等到所有依賴該版本的事務完成后才能釋放
  3. 段管理:回滾段通過rseg_history_len維護歷史版本長度,協調線程根據此值觸發purging操作。當事務提交時,會向回滾段注冊,當事務回滾時,系統會根據回滾指針追溯并恢復數據。

這種結構設計使得事務回滾和MVCC版本控制變得高效,避免了對數據頁的直接修改,減少了鎖競爭,同時保證了事務的原子性。

1.3 Undo Log清理機制與長事務風險

Undo Log的清理由purge線程負責,其工作流程如下:

  1. 觸發條件:當事務提交或回滾時,系統會調用srv_active_wake_master_thread()喚醒協調線程。
  2. 協調線程檢測:協調線程srv_purge_coordinator_thread()會檢查rseg_history_len是否變化。如果無新事務提交且歷史長度未超過閾值(如5000),則進入無限期等待狀態。
  3. 版本鏈遍歷:當協調線程被喚醒后,工作線程會遍歷版本鏈,根據ReadView的min_trx_id判斷版本是否可清理。版本的DB_TRX_ID需小于min_trx_id,即對所有活躍事務都不可見時,才能被清理。
  4. 清理操作:清理操作包括刪除標記記錄、回收undo歷史版本。系統會先從最新版本回溯,找到符合條件的版本后,將其從版本鏈中移除。

長事務對Undo Log的影響:長事務會阻礙undo log版本的回收,導致undo tablespace空間膨脹和查詢性能下降。具體表現為:

  • 空間占用:長事務使undo log版本無法被清理,undo tablespace持續增長,可能導致磁盤空間不足
  • 版本鏈長度:長事務導致版本鏈過長,查詢時需要遍歷更多版本,增加CPU開銷
  • Purge線程效率:當rseg_history_len持續增長時,purge線程的工作量增加,可能無法及時清理舊版本

官方建議:通過SHOW ENGINE INNODB STATUS監控undo log使用情況,設置合理的innodb_max undo_log_size參數限制undo tablespace大小,避免長事務阻塞系統清理。

二、MVCC實現原理

2.1 快照讀與ReadView

MVCC的核心是通過ReadView實現快照讀,使事務能夠看到一致的數據視圖,而不必等待其他事務釋放鎖。ReadView的生成規則如下:

  1. RC(讀未提交)隔離級別:
  • 每次SQL讀操作都會生成新的ReadView
  • ReadView僅包含當前系統最大事務ID(max_trx_id)
  • 可見性規則:DB_TRX_ID < max_trx_id,即讀取最新已提交版本
  1. RR(可重復讀)隔離級別
  2. 事務首次執行讀操作時生成ReadView
  3. ReadView包含活躍事務列表(m_ids)、最小活躍事務ID(min_trx_id)、最大事務ID(max_trx_id)和創建事務ID(creator_trx_id)
  4. 可見性規則:
    • DB_TRX_ID < min_trx_idDB_TRX_ID == creator_trx_id
    • DB_TRX_ID不在活躍事務列表(m_ids)中

ReadView的生成時機與事務隔離級別密切相關,是MVCC實現一致性的關鍵。

2.2 隔離級別實現差異

RC與RR隔離級別的本質差異在于可見性判斷機制和鎖策略

隔離級別ReadView生成時機可見性判斷規則幻讀防護機制
RC每次讀操作DB_TRX_ID < max_trx_id無間隙鎖,依賴版本可見性規則
RR事務首次讀操作DB_TRX_ID < min_trx_id且不在活躍列表使用間隙鎖和臨鍵鎖防止幻讀

在**RC隔離級別下,事務讀取的是當前最新已提交版本**,不保證可重復讀。每次讀操作都生成新的ReadView,捕獲當前系統最大事務ID(max_trx_id),版本的DB_TRX_ID小于該值即可見。

而在RR隔離級別下,事務讀取的是事務開始時的快照,保證可重復讀。事務首次讀操作時生成ReadView,捕獲所有活躍事務ID并記錄最小值(min_trx_id)。后續讀操作使用同一ReadView,只有版本的 DB_TRX_ID 小于min_trx_id 或等于事務自己的ID時才可見。

幻讀防護:RR隔離級別通過間隙鎖和臨鍵鎖防止幻讀,而RC不使用此類鎖,僅依賴版本可見性規則。

2.3 版本可見性判斷算法

InnoDB的版本可見性判斷算法是MVCC的核心邏輯,其實現如下:

  1. 獲取當前版本:讀取數據行的當前版本,檢查其DB_TRX_IDDB刪除標記
  2. 可見性判斷
    • 如果版本的DB刪除標記為已刪除且DB刪除TRX_ID ≤ 當前事務的min_trx_id,則該版本**不可見**
    • 如果版本的DB刪除標記為已刪除且DB刪除TRX_ID > 當前事務的min_trx_id,則該版本**可見**
    • 如果版本的DB刪除標記為未刪除且DB創建TRX_ID > 當前事務的min_trx_id,則該版本**不可見**
    • 如果版本的DB創建TRX_ID < 當前事務的min_trx_id或等于事務自己的ID,則該版本**可見**
  3. 回溯歷史版本:如果當前版本**不可見**,通過DB_ROLL_ptr回溯到上一個版本,重復可見性判斷,直到找到可見版本或版本鏈結束。

這種基于版本號的可見性判斷機制,使得讀操作不需要加鎖,極大提高了系統的并發性能。同時,通過ReadView維護活躍事務信息,確保了事務隔離性的實現。

三、鎖系統剖析

3.1 行鎖類型與實現機制

InnoDB的鎖系統主要包含以下幾種行鎖類型:

  1. 記錄鎖(Record Locks)
    • 鎖定單個索引記錄
    • 依附于索引存在,未命中索引時升級為表鎖
    • 用于防止其他事務修改同一行數據
    • 實現方式:在B+樹的葉子節點上設置鎖標記
  2. 間隙鎖(Gap Locks)
    • 鎖定索引記錄之間的間隙
    • 不包含記錄本身
    • 主要用于防止幻讀
    • 實現方式:在B+樹的非葉子節點上設置鎖區間
  3. 臨鍵鎖(Next-Key Locks)
    • 結合記錄鎖和間隙鎖
    • 鎖定記錄本身及其前面的間隙
    • RR隔離級別下的默認鎖類型
    • 實現方式:通過組合記錄鎖和間隙鎖的標志位
  4. 插入意向鎖(Insert Intention Locks)
    • 間隙鎖的一種特殊形式
    • 允許多個事務并發插入同一間隙區間的不同位置
    • 用于自增主鍵等場景的并發插入優化
  5. 意向鎖(Intention Locks)
    • 表級鎖,用于聲明對表中行的加鎖意圖
    • 包括意向共享鎖(IS)和意向排他鎖(IX)
    • 用于快速判斷表是否被鎖,避免全表掃描

鎖模式兼容性:InnoDB的鎖模式遵循嚴格的兼容性規則:

XS
X不兼容不兼容
S不兼容兼容

共享鎖(S)允許多個事務同時讀取同一行數據,但阻止寫入;排他鎖(X)獨占訪問行數據,阻止其他事務讀寫 。

3.2 鎖獲取流程與數據結構

InnoDB的鎖獲取流程如下:

  1. 查詢索引:通過B+樹查找目標記錄,根據查詢條件確定需要鎖定的范圍。
  2. 判斷鎖類型
    • 等值查詢:獲取記錄鎖
    • 范圍查詢:獲取臨鍵鎖或間隙鎖
    • 插入操作:獲取插入意向鎖
  3. 檢查鎖兼容性:根據鎖模式矩陣判斷當前事務能否獲取鎖。
  4. 加鎖操作
    • 如果兼容,直接加鎖
    • 如果不兼容,進入等待狀態,記錄等待關系

鎖在InnoDB中通過以下數據結構實現:

  • LOCK_rec_t:表示單個記錄的鎖信息,包含鎖模式、事務ID等
  • LOCK_gap:表示間隙鎖的信息
  • LOCK(ordinary):表示臨鍵鎖的信息
  • LOCK Insert Intention:表示插入意向鎖的信息

鎖信息存儲在B+樹的頁中,每個頁維護一個鎖列表。對于記錄鎖,鎖信息直接附加在記錄上;對于間隙鎖,鎖信息存儲在索引頁的間隙區間中。

3.3 死鎖檢測機制

InnoDB的死鎖檢測基于等待圖算法,其實現流程如下:

  1. 等待關系記錄:當事務申請鎖被阻塞時,系統會記錄等待關系,形成等待圖。
  2. 周期性檢測:InnoDB定期檢查等待圖中是否存在環路。檢測頻率由innodb_deadlock_detect參數控制,可設置為offonsearch
  3. 環路檢測算法:采用深度優先搜索(DFS)或廣度優先搜索(BFS)算法遍歷等待圖,尋找環路。
  4. 死鎖處理:一旦檢測到死鎖,系統會選擇一個犧牲事務進行回滾。選擇標準通常包括:
    • 事務持有鎖的時間最短
    • 事務回滾成本最低
    • 隨機選擇避免偏向某些事務

等待圖結構:InnoDB的等待圖由多個節點和邊組成。每個節點代表一個事務,邊表示事務之間的等待關系。當事務A等待事務B釋放鎖,而事務B又等待事務A釋放鎖時,就形成了環路,系統會檢測到死鎖。

3.4 隔離級別與鎖策略的協同

InnoDB的鎖策略與事務隔離級別緊密協同:

  • RC隔離級別:主要依賴MVCC的版本可見性規則,讀操作不加鎖,寫操作加排他鎖
  • RR隔離級別:在MVCC基礎上,增加間隙鎖和臨鍵鎖機制防止幻讀
    • 范圍查詢自動加臨鍵鎖
    • SELECT ... FOR UPDATE操作加臨鍵鎖
    • SELECT ... LOCK IN SHARE MODE操作加記錄鎖

這種協同設計使得InnoDB在保證事務隔離性的同時,最大限度地提高了并發性能。RC隔離級別犧牲了一定的隔離性換取更高的讀性能,而RR隔離級別則在保證可重復讀的基礎上,通過間隙鎖防止幻讀。

四、性能特點與優化策略

4.1 MVCC與鎖的性能權衡

InnoDB的并發控制機制在性能與隔離性之間做了精妙的權衡

  • 讀操作性能:MVCC機制使得讀操作不需要加鎖,極大提高了讀性能。RC隔離級別下讀性能最高,但隔離性最低。
  • 寫操作性能:寫操作需要加排他鎖,但MVCC機制減少了鎖的持有時間。在事務提交時,鎖被釋放,其他事務可以立即訪問數據。
  • 空間開銷:MVCC機制需要額外存儲歷史版本數據,增加了存儲空間開銷。長事務會進一步加劇這一問題。
  • 版本鏈長度:頻繁的更新操作會導致版本鏈過長,增加查詢時的遍歷開銷。

最佳實踐:根據業務場景選擇合適的隔離級別,避免不必要的長事務,合理設置innodb_purge_threads參數提高清理效率。

4.2 高并發場景下的優化策略

在高并發場景下,InnoDB的并發控制機制可以通過以下策略優化:

  1. 鎖拆分技術
    • 對熱點數據采用分桶策略,將操作分散到不同行
    • 使用更細粒度的索引,減少鎖的范圍
  2. 避免間隙鎖膨脹
    • 在RR隔離級別下,使用SELECT ... FOR UPDATE時盡量精確鎖定范圍
    • 考慮使用innodb_locks_unsafe_forbinlog參數減少間隙鎖(需權衡隔離性)
  3. 優化事務設計
    • 減少事務持有時間,盡快提交或回滾
    • 避免在事務中執行長時間的查詢或計算
    • 合理使用COMMITROLLBACK語句,而不是依賴自動提交
  4. 監控與調整
    • 使用SHOW ENGINE INNODB STATUS監控鎖等待和事務狀態
    • 調整innodb_lock Wait_timeout參數控制鎖等待時間
    • 監控undo tablespace使用情況,及時清理或擴容

這些優化策略可以幫助系統更好地處理高并發場景,減少鎖競爭和死鎖風險,提高系統整體性能。

五、源碼分析與關鍵函數

5.1 Undo Log相關源碼

InnoDB的Undo Log實現主要集中在以下源碼文件中:

  1. undo0undo.c
    • undo Log Create Space():創建undo表空間
    • undo Log Truncate():截斷undo表空間
    • undo Log Apply():應用undo log進行回滾
  2. undo0roll.h
    • 定義undo記錄結構
    • 實現undo鏈表遍歷邏輯
  3. undo0rec.c
    • undo記錄的讀寫操作
    • undo版本可見性判斷

關鍵數據結構undo Log Spaceundo Segment管理undo log的物理存儲,undo Page存儲具體的undo記錄,undo Record表示單個數據修改的前映像。

5.2 MVCC相關源碼

MVCC的核心實現位于以下源碼文件:

  1. row0mysql.c
    • row Is可見():判斷版本是否可見的核心函數
    • row Read View():生成和管理ReadView的函數
  2. trx0view.h
    • 定義struct read_view:包含m_ids(活躍事務列表)、min_trx_id(最小活躍事務ID)、max_trx_id(最大事務ID)和creator_trx_id(創建事務ID)
  3. undo0undo.c
    • undo Log Get():獲取歷史版本數據

可見性判斷函數row Is可見()是MVCC的核心函數,根據事務隔離級別和ReadView的屬性,判斷當前版本是否可見。在RC隔離級別下,該函數主要檢查DB_TRX_ID < max_trx_id;在RR隔離級別下,則需要同時滿足DB_TRX_ID < min_trx_id和不在活躍事務列表中。

5.3 鎖系統相關源碼

鎖系統的實現主要位于以下源碼文件:

  1. lock0lock.c
    • lock Acquire():獲取鎖的核心函數
    • lock死鎖檢測():死鎖檢測的核心算法
    • lock Wait():處理鎖等待的邏輯
  2. lock0wait.c
    • lock Wait Graph Build():構建等待圖的函數
    • lock Wait Graph Check():檢查等待圖中是否存在環路
  3. lock0btr.c
    • lock Btr Acquire():在B+樹中獲取鎖的函數
    • lock Btr Release():釋放B+樹中鎖的函數

關鍵數據結構LOCK Table表示表級別的鎖信息,LOCK Index表示索引級別的鎖信息,LOCK Rec表示記錄級別的鎖信息,LOCK Gap表示間隙鎖的信息。

死鎖檢測函數lock死鎖檢測()函數通過遍歷鎖等待圖,尋找是否存在環路。當檢測到死鎖時,系統會調用lock死鎖處理()函數選擇一個犧牲事務進行回滾。

六、總結與展望

InnoDB的事務引擎通過MVCC和鎖系統的協同工作,實現了高性能的并發控制。Undo Log與回滾段構建了多版本數據鏈,支持事務的回滾和快照讀;MVCC通過ReadView實現了不同隔離級別的可見性規則;鎖系統則通過多種行鎖類型和死鎖檢測算法,確保了事務的互斥和系統的一致性。

未來發展趨勢可能包括:

  1. 更細粒度的鎖機制:如基于列的鎖或更智能的鎖范圍控制
  2. 更高效的MVCC實現:如減少版本鏈長度或優化可見性判斷算法
  3. 分布式事務支持:如PolarDB-X等分布式數據庫在InnoDB基礎上的擴展

在實際應用中,理解InnoDB的并發控制機制對于優化數據庫性能至關重要。開發者應當根據業務場景合理選擇隔離級別,設計高效的索引結構,避免長事務和鎖競爭,才能充分發揮InnoDB事務引擎的性能優勢。

通過本文的深入剖析,希望讀者能夠全面理解MySQL InnoDB事務引擎的核心工作機制,為實際應用中的性能優化和問題排查提供理論指導。

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

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

相關文章

[ pytorch ] 基于CLIP的zero-shot圖像分類

論文&#xff1a;Learning Transferable Visual Models From Natural Language Supervision 地址&#xff1a;Learning Transferable Visual Models From Natural Language Supervision 一、關于CLIP 基于圖文匹配的特征學習&#xff1a;該論文證明了預測哪個標題與哪個圖像…

SP95N65CTO:一款高性能650V SiC MOSFET的全面解析

碳化硅&#xff08;SiC&#xff09;功率器件因其優異的性能&#xff0c;在高頻、高溫、高效率的應用中越來越受到重視。本文將以SP95N65CTO為例&#xff0c;詳細介紹這款650V SiC MOSFET的關鍵特性、電氣參數與應用場景。一、產品概述SP95N65CTO是一款采用TOLI&#xff08;TO-2…

week4-[二維數組]平面上的點

week4-[二維數組]平面上的點 題目描述 有 NNN 個二維平面上的點&#xff0c;每個點的坐標都是整數且坐標范圍都在 0~9990\sim 9990~999 之間&#xff0c;求其中出現最頻繁的點的出現次數及其坐標。 輸入格式 第一行有一個整數 NNN&#xff0c;表示平面上點的個數。 接下來 NN…

領域專用AI模型訓練指南:醫療、法律、金融三大垂直領域微調效果對比

領域專用AI模型訓練指南&#xff1a;醫療、法律、金融三大垂直領域微調效果對比 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0…

在自動駕駛中ESKF實現GINS時,是否將重力g作為變量考慮進去的目的是什么?

在自動駕駛的ESKF中&#xff0c;是否將重力 g 作為估計變量&#xff0c;可以從多個維度來比較這兩種方法的差異。對比維度不將重力 g 作為變量將重力 g 作為變量核心假設重力矢量 g 是已知且恒定的完美參考量。重力矢量 g 是需要被估計或校準的量&#xff0c;其值可能存在不確定…

Dify 從入門到精通(第 55/100 篇):Dify 的模型微調(進階篇)

Dify 從入門到精通&#xff08;第 55/100 篇&#xff09;&#xff1a;Dify 的模型微調 Dify 入門到精通系列文章目錄 第一篇《Dify 究竟是什么&#xff1f;真能開啟低代碼 AI 應用開發的未來&#xff1f;》介紹了 Dify 的定位與優勢第二篇《Dify 的核心組件&#xff1a;從節點…

《Password Guessing Using Large Language Models》——論文閱讀

1.研究背景LLM在文本生成和理解方面表現出色&#xff0c;但直接用于密碼猜測存在以下問題&#xff1a;密碼與自然語言的差異&#xff08;短、無語法、需精確匹配&#xff09;生成效率低、重復率高倫理限制&#xff08;如GPT-4拒絕生成大量密碼&#xff09;2.本文研究提出PASSLL…

C# 使用OPCUA 與CODESYS進行標簽通訊

目錄 1.導出的標簽 識別標簽名稱 2.引用OPCUA的包 3.讀寫方法的封裝 4.完整的業務模塊封裝 1.導出的標簽 識別標簽名稱 從CODESYS導出使用標簽通訊的模塊文檔 大概是這樣子的 <?xml version"1.0" encoding"utf-8"?> <Symbolconfiguratio…

C++ 中 `std::map` 的 `insert` 函數

1. 函數的概念與用途 std::map::insert 是 C 標準模板庫&#xff08;STL&#xff09;中 map 容器的一個核心成員函數。它的核心任務很明確&#xff1a;向 map 中插入一個新的鍵值對&#xff08;key-value pair&#xff09;。 核心用途&#xff1a; 數據構建&#xff1a;初始化一…

【機器學習學習筆記】機器學習引言

前言本文章是撥珠自己的學習筆記&#xff0c;自用為主&#xff0c;學習請移步專門教程&#xff0c;若有錯誤請大佬輕噴&#xff0c;也歡迎同好交流學習。本文將闡述三個問題。什么是機器學習&#xff1f;監督學習、無監督學習到底在干什么&#xff1f;分類、回歸、聚類又是怎么…

程序設計---狀態機

在軟件工程、嵌入式開發、自動化控制等領域&#xff0c;狀態機&#xff08;State Machine&#xff09;是一種描述系統行為的強大工具。它通過抽象“狀態”“事件”“轉換”和“動作”四大核心要素&#xff0c;將復雜的邏輯流程轉化為可視化、可驗證的狀態流轉規則&#xff0c;廣…

GaussDB 數據庫架構師修煉(十八) SQL引擎-分布式計劃

1 分布式架構GaussDB基于MPP &#xff08;Massively Parallel Processing&#xff09; 并行架構Streaming流式計算框架2 分布式計劃CN輕量化&#xff08;light proxy&#xff09; FQS&#xff08; fast query shipping &#xff09; STREAM計劃 XC計劃計劃類型場景原理CN…

微前端架構核心要點對比

1. 樣式隔離 常見的隔離方式有以下幾種,還是根據自身業務來確定: 1.1. shadowDOM 目前相對來說使用最多的樣式隔離機制。 但shadowDOM并不是銀彈,由于子應用的樣式作用域僅在 shadow 元素下,那么一旦子應用中出現運行時“翻墻”跑到外面構建 DOM 的場景,必定會導致構建…

VMware 17.6安裝包下載與保姆級圖文安裝教程!

軟件下載 [軟件名稱]&#xff1a;VMware 17.6 [軟件大小]&#xff1a;226.66MB [系統環境]&#xff1a;win 7/8/10/11或更高&#xff0c;64位操作系統 VMware合集&#xff0c;軟件下載&#xff08;夸克網盤需手機打開&#xff09;&#xff1a;&#xff1a;VMware合集丨夸克網…

關于微服務下的不同服務之間配置不能通用的問題

問題引入現有兩個服務&#xff0c;一個是 A 服務&#xff0c;一個是 B 服務&#xff0c;并且這兩個服務都需要使用 mysql。現 B 服務中引入了 A 服務的依賴&#xff0c;在 A 服務中添加了 mysql 的相關配置&#xff0c;那么這時就有一個問題&#xff1a;既然 B 已經引入了 A 的…

【機器學習項目 心臟病預測】

文章目錄心臟病預測導入數據集數據集介紹理解數據數據處理機器學習K近鄰分類器邏輯回歸支持向量分類器&#xff08;SVC&#xff09;決策樹分類器隨機森林分類器結論心臟病預測 在這個機器學習項目中&#xff0c;我們使用UCI心臟病數據集 UCI &#xff0c;并將使用機器學習方法…

【論文閱讀 | arXiv 2025 | WaveMamba:面向RGB-紅外目標檢測的小波驅動Mamba融合方法】

論文閱讀 | arXiv 2025 | WaveMamba&#xff1a;面向RGB-紅外目標檢測的小波驅動Mamba融合方法??1&&2. 摘要&&引言3. 方法3.1. 預備知識3.2. WaveMamba3.3. WaveMamba融合塊&#xff08;WMFB&#xff09;3.3.1. 低頻Mamba融合塊&#xff08;LMFB&#xff09;…

DevExpress發布PowerPoint Presentation API庫,支持跨平臺與 PDF 導出

DevExpress專注于為 .NET、JavaScript、VCL 等多種平臺提供高性能 UI 控件、報表工具、數據可視化組件及開發框架&#xff0c;產品覆蓋桌面、Web、移動及跨平臺應用開發領域。憑借穩定的性能、豐富的功能與優質的技術支持&#xff0c;DevExpress 的解決方案已廣泛應用于金融、制…

Vue3使用 DAG 圖(AntV X6)

參考文檔 AntV X6 文檔 可自定義設置以下屬性 容器寬度&#xff08;width&#xff09;&#xff0c;類型&#xff1a;number | string&#xff0c;默認 ‘100%’容器高度&#xff08;height&#xff09;&#xff0c;類型&#xff1a;number | string&#xff0c;默認 ‘100%’…

【數據結構】跳表的概率模型詳解與其 C 代碼實現

文章目錄介紹關鍵組成部分讀者可以比對這張圖片去理解跳表 ![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/c5704b6276a14c3f9facdc3e55015bcc.jpeg#pic_center) 核心操作原理算法的概率模型跳表的 C代碼實現初始化跳躍表的節點、跳躍表本身跳表插入節點查找元素更新…