InnoDB內部實現一點筆記

2021-07-16 14:44:23 字數 1294 閱讀 3979

innodb是多執行緒模型,後台有不同的執行緒負責處理不同的任務

1.1master thread

非常核心的後台執行緒,主要負責將緩衝池中的資料非同步重新整理到磁碟,保證資料的一致性

1.2io thread

innodb大量使用了aio來處理寫io請求,極大地提高了資料庫的效能

1.3 purge thread

事務被提交後,其所使用的undolog可能不再需要了,所以使用purgethread來**已經使用並分配的undo頁

1.4 page cleaner thread

負責處理髒頁的重新整理

innodb會監控表上各個索引頁的查詢,若發現某些頁訪問頻率很高,則會自動建立自適應雜湊索引(ahi),ahi通過緩衝池的b+樹頁構造而來,因此其建立的速度很快,而且不需要對整張表建立索引。這是個innodb自動建立過程,不需要人為干預

非同步io除過能提高磁碟的操作效能,還有乙個優勢就是io merge,也就是將多個io合併成乙個io,提高iops效能。比如使用者分多次訪問連續頁的資料,那麼aio判斷這個頁是連續後,會傳送乙個io請求,取到多次請求的結果

當innodb重新整理乙個頁時,會判斷相鄰的頁是否是髒頁,若是,會將其一起重新整理。有乙個問題是,我們重新整理的頁是不是又會馬上被重新整理,因為一般重新整理是lru演算法,這裡直接重新整理,會不會有問題?

innodb中,表都是根據主鍵順序組織存放的,這種儲存方式的表稱為索引組織表,如在建立表時沒有指定主鍵,則自動建立乙個6位元組的主鍵

innodb中,所有的資料都被存放在乙個空間中,稱為表空間。表空間由段、區、頁組成

6.1表空間

可以看做是innodb儲存引擎的最高邏輯結構層,所有的資料都存放在表空間中。預設有乙個共享表空間,但使用者也可以設定每張表的資料單獨放到乙個表空間中。

6.2段

表空間由多個段組成,常見的段有資料段,索引段,回滾段。在b+樹中,資料段即為葉子節點,索引段即為非葉子節點

6.3區

區由連續的頁組成,任何情況下大小都為1mb。為了保證區中頁的連續性,innodb一次會從磁碟申請多個區,預設情況下,乙個頁大小為16kb,所以乙個區中一共有64個連續的頁。現在也引入了壓縮頁

6.4頁

頁時innodb磁碟管理的最小單位,有多種型別的頁。頁中有乙個屬性叫做page directory記錄了記錄的相對位置。牢記的是,b+樹索引並不能找到具體的記錄,它只會找到記錄所在頁,資料庫把頁載入記憶體,然後通過page directory進行二分查詢,記憶體中二分查詢很快,所以這部分查詢時間可以忽略不計

分割槽主要是為了資料庫的高可用性

主要有range分割槽,如 2分割槽不一定提高效能,但肯定會提高資料庫的可用性

php一點筆記

1.replace函式作用 替換字串中匹配到的預先定義的正規表示式的內容 3.建立與資料庫的連線 db mysql connect localhost root or die could not connect mysql error mysql select db register or die ...

Redis的一點筆記

優勢之三原子 什麼是原子性,什麼是原子性操作?舉個例子 a想要從自己的帳戶中轉1000塊錢到b的帳戶裡。那個從a開始轉帳,到轉帳結束的這乙個過程,稱之為乙個事務。在這個事務裡,要做如下操作 如果在a的帳戶已經減去了1000塊錢的時候,忽然發生了意外,比如停電什麼的,導致轉帳事務意外終止了,而此時b的...

jdbc一點小筆記

jdbc的常用介面的步驟,1使用driver或者class.forname 進行註冊驅動 2使用drivermanager進行獲取資料庫的鏈結 使用connection獲取語句物件 使用語句物件介面statement方法執行查詢或更新操作 查詢的resultset是結果集使用之前一定要先判斷是否存在...