《mysql核心:innodb儲存引擎 卷1》從原始碼層次分析了innodb的體系結構、原理、工作機制等,結合實踐案例,對我們想深入學習mysql innodb 核心原理來說,是不可多得的好書。
思考:mysql innodb引擎同 myisam 的比較
myisam是非事務安全型,而innodb是事務安全型。
myisam鎖的粒度是表級,而innodb支援行級鎖定。
myisam支援全文型別索引,而innodb不支援全文索引。
。。。。
innodb儲存引擎**模組劃分:
基礎:filemananger模組:對檔案操作,如讀寫、非同步i/o等
concurrencymanager:併發,封裝引擎內部使用的mutex、latch等
common utility:基本演算法和資料結構
核心:索引、事務、lock、快取、日誌、儲存等模組
innodb儲存引擎以嵌入方式同mysql結合。
第2章 介紹了innodb記憶體管理系統的基本實現及資料結構。採用記憶體堆的方式關聯記憶體物件。通過一次性分配大塊記憶體來減少記憶體申請(malloc)、釋放(free)帶來的開銷。
分為緩衝池分配(從緩衝池中分配記憶體)、動態分配(直接系統分配:malloc函式)。
記憶體管理的層次結構:
記憶體堆層
緩衝層、通用記憶體池
系統記憶體
記憶體堆層
記憶體堆類似stack,通過增加記憶體塊增加空間,從stack top位置釋放相應記憶體塊。記憶體塊之間以鍊錶的形式管理。記憶體塊結構:men_block_info_t(見書p9)
記憶體堆中各個記憶體塊組織形式:(圖02)
記憶體堆分類:
記憶體堆建立函式:men_heap_create_func,通過不同分配方式(3種)初始化堆記憶體大小、指標。
通用記憶體池
men_common_pool物件,資料結構:men_pool_struct,包括記憶體池分配的起始位置、大小size、已分配大小reserved;記憶體單元鍊錶節點陣列free_list。
通用記憶體池通過free_list[64]、men_area_struct組成夥伴系統。記憶體池分成64個記憶體區鍊錶,以2^n(n<=64)分配記憶體。文中通過例項進行了明確的講解:
安規則將記憶體分割,再看申請空間大小進行更小分塊。釋放則將相連的空閒空間進行合併。
基本演算法結構
本文還對基本的演算法結構(雜湊演算法、雙向鍊錶(基於記憶體、磁碟)、動態陣列),基本排序實現做了相應的介紹。
雙鏈表應用場景及區別:
記憶體雙鏈表:緩衝池、事務、lock、檔案管理等。用於記憶體中快速定位
磁碟雙鏈表:表空間管理、事務管理、b樹模組;用於建立磁碟中資料結構之間的關係。
MySQL核心解析 Innodb頁面儲存結構 1
本文介紹innodb的索引資料頁面儲存結構,主要介紹資料頁面的整體結構,而頁面的詳細結構將會在另一篇中介紹。1.b 樹 閱讀本文前,首先要知道一些關於b樹的基礎知識。innodb的乙個表可能包含多個索引,每個索引都使用b 樹來儲存。而索引包括聚集索引和二級索引,聚集索引使用表的主鍵作為索引鍵,包含表...
MySQL儲存引擎 InnoDB
為什麼innodb不將總數存起來?innodb直接count 會遍歷全表 沒有where條件 雖然結果準確,但會導致效能問題。按照效率排序的話,count 字段 innodb一棵b 樹可以存放多少行資料?這個問題的簡單回答是 約2千萬。為什麼是這麼多呢?因為這是可以算出來的,要搞清楚這個問題,我們先...
MySQL的儲存引擎INNODB
1 一般情況下,mysql會預設提供多種儲存引擎,你可以通過下面的檢視 看你的mysql現在已提供什麼儲存引擎 mysql show engines 看你的mysql當前預設的儲存引擎 mysql show variables like storage engine 你要看某個錶用了什麼引擎 在顯示...