MySQL: 第二遍→【MySQL技術內幕+InnoDB存儲引擎】學習之(一)

根據《MySQL技術內幕+InnoDB存儲引擎》一書的學習記錄


目錄

根據《MySQL技術內幕+InnoDB存儲引擎》一書的學習記錄

第一章:體系結構

1.1、關於數據庫 與 數據庫實例的理解,實例應該理解爲管理這些數據的運行程序。

1.2、mysql體系結構

第二章:innodb 存儲引擎

2.1、關於後臺線程

2.2、關於內存

2.3、Master Thread  工作方式(?沒懂)

2.4、innodb 關鍵特性

2.4.1 insert buffer:

2018/12/23記錄

2.4.2 double write:

2.4.3 adaptive hash index: 自適應哈希索引

2.4.4 async IO:異步IO

2.4.5 flush neighbor page:刷新臨近頁

2.5、啓動、關閉與恢復

第三章  文件

3.1、參數文件:

3.2、日誌文件

3.2.1 error log:錯誤日誌

3.2.2 binlog:二進制日誌

3.2.3 slow query log:慢查詢日誌

3.2.4 log:查詢日誌

3.3、套接字文件

3.4、pid 文件

3.5、表結構定義文件

3.6、Innodb 存儲引擎文件

3.6.1 表空間文件:

3.6.2 redo log 文件:

總結:


2018/12/22 號記錄

第一章:體系結構

1.1、關於數據庫 與 數據庫實例的理解,實例應該理解爲管理這些數據的運行程序。

1.2、mysql體系結構

最底層都是文件系統,上面是存儲引擎,主要學習的是  innodb 引擎,innodb引擎是基於 表的,它的表的數據是存在 ibd 文件之中。innodb使用MVCC 來達到高併發,同時較爲突出的特性還有  插入緩衝,兩次讀,自適應hai哈希索引,預讀 等。

innodb 存儲採用 聚簇  的方式,表中存儲的數據都是按照 主鍵 的順序進行存儲的,如果 在建立表的時候不存在 顯示指定的主鍵,innodb 會 爲每一個 元組 生成一個 6 字節的 ROWID 作爲主鍵。

mysql的進程通信,網絡的進程通信 有兩種,socket 與 tcp/ip 連接, 本地進程通信 爲 命名管道 與 共享內存。

 

 

第二章:innodb 存儲引擎

2.1、關於後臺線程

四種線程,master thread,IO thread, purge thread,page cleaner thread。

關於  IO thread:

purge thread:在事務被提交之後,需要回收  undo 日誌文件頁,通過這個線程完成。可是設置多個提高效率。

page cleaner thread : 髒頁刷新線程,減輕 master thread 的壓力。

 

2.2、關於內存

加入 緩衝 池 機制,buffer pool。在緩衝池中的數據頁  類型有:索引、數據、undo、插入緩衝、自適應哈希索引、鎖信息、數據字典信息。允許 多個 緩衝池實例,哈希平均分配。自行配置。

 

LRU:修改緩衝的頁,引入 checkpoint 機制,一定規律刷新到磁盤。通過 指定的(非直接加到頭部 的)LRU 算法維護主要的索引頁與數據頁。每個 頁 16KB。之後引入了 壓縮頁(略,暫時瞭解),Free LIst 空閒頁列表,Flush List 髒頁列表。

重做日誌緩衝:redo log buffer,重做日誌文件的緩衝。

額外的內存池: 數據結構自身的存儲空間。

checkpoint:用於判斷 何時 刷新髒頁到磁盤的機制。關於數據有改變的過程:每次事務提交之前,先是對重做日誌進行修改,先修改的是重做日誌緩衝,之後的事務執行,修改其他的頁數據(都先是緩衝修改),當髒頁都被刷新到次磁盤中後,這部分的重做日誌纔會相當於失效,宕機後不會影響這部分的內容???但是後面也說,無論事務是否提交重做日誌都會每秒刷新到磁盤,所以 checkpoint也需要在這裏強制產生???

關於checkpoint 具體發生時間:?????????

 

2.3、Master Thread  工作方式(?沒懂)

 

 

2.4、innodb 關鍵特性

2.4.1 insert buffer:

insert buffer 是物理頁,不是在緩衝池中。

關於插入與更新操作,在緩衝池之下的層次,主要是更新索引頁,插入或者更新節點。

插入緩衝的作用是針對非聚集的輔助索引。在進行插入操作的是,同時需要更新“所有”的索引頁,即聚集索引的節點需要添加,非聚集的輔助索引(需要該索引來查詢的)索引節點也需要插入(B+樹)。數據頁的存放還是按照主鍵順序。針對聚集索引(主鍵)的是順序的訪問,但是針對輔助索引的節點插入時隨機的,需要離散的訪問非聚集索引頁,導致性能下降。

緩衝池中有很多的非聚集索引頁,如果需要添加的輔助索引對應的索引頁在緩衝池,直接添加。不在則添加到insert buffer中,之後inser buffer 物理頁與 對應的非聚集索引頁進行子節點的合併操作(相當於另外一個索引的緩衝池,多個一次性刷新)。這樣就會降低離散訪問(根據輔助索引查詢索引的時候需要遍歷)的次數,問題:每張表都會有一個索引頁???。並且插入的索引會相對順序。

佔用的是  緩衝池  的內存,但時實際是 物理頁。不是緩衝池的組成部分????

insert buffer 的升級版本是  change buffer:

 

insert buffer 的實現:

insert buffer 是使用 B+ 樹的結構,現在的版本全局只有一個 insert buffer,放在共享表空間中,即 ibdata1。一個B+數即一部分的數據內存塊,通過地址的不同尋址方式(每個內存空間都有對應的地址)形成的。

之後的 具體插入細節看不懂????

合併 索引頁:

 


2018/12/23記錄

2.4.2 double write:

數據損壞問題:部分寫失效問題,因爲不同級別的IO單位不同,磁盤一個扇區大小  512 bytes,一個簇由很多的 扇區 組成,

對於文件系統的 IO 來說,一個文件需要佔用多個簇,且一個簇 (8個扇區)只能有一個文件佔用。所以針對一個文件系統 IO 的最小單位一般是   4 KB。

針對數據庫來說,每個 頁  的大小是  16 KB。 

所以一個  髒頁 刷線到 磁盤的時候,16 K 的頁 需要 32 個扇區,所以在這個過程中發生了宕機,後果即是  頁的 損壞。

 

 

insert buffer保證高效,double write 保證了數據的高可靠性。在寫操作失效的時候,一般是通過 redo 日誌進行重做,即從 緩衝池 刷新髒頁到磁盤的時候,發生了宕機,通過 redo 日誌 重做存在一個問題,即該磁盤的物理頁損壞了,所以重做是沒有用的,所以在刷新到髒頁的時候,需要一個副本的存在。所以引入了 double write ,即刷新髒頁的時候,首先copy到的double write buffer(內存實例中,不在緩衝池中) 中,先刷新到 (物理磁盤上)共享表空間的 double write的2MB上,之後再同步到磁盤,如果同步到磁盤的操作出錯,那麼通過 共享表空間連續的 128 個頁(128x16=2MB = 1 MB + 1 MB)內存,先恢復到之前的狀態再進行重做。

問題:既然 double write的內存中已經有了 最新的,爲什麼直接使用 redo 恢復到最新的情況?還是說需要體現 redo的作用?

https://www.cnblogs.com/geaozhang/p/7241744.html  網上沒有說清楚。

 

2.4.3 adaptive hash index: 自適應哈希索引

自適應的哈希索引,針對 等值查找  的操作,如果某些查找模式 如 where a = 'xxx'  或者  where a='xxx' and b= 'xxx’ 的出現頻率較高,那麼存儲引擎會針對這種模式,在B+樹以外針對某些熱點也建立哈希索引。比如一次查找先是根據B+樹的索引 查到對應 索引的對應頁,再去遍歷對應的頁。但是在B+樹的查找上面花的時間可以通過哈希索引提高效率。

2.4.4 async IO:異步IO

 

2.4.5 flush neighbor page:刷新臨近頁

 

2.5、啓動、關閉與恢復

通過 kill 命令模擬  數據庫 服務 宕機,之後的數據庫回滾。開啓一個事務,更改數據,此時會修改undo邏輯日誌,但是沒有實際修改。此處見 書  2.7。

 

 

第三章  文件

3.1、參數文件:

鍵值對形式,動態靜態參數兩種類型

3.2、日誌文件

3.2.1 error log:錯誤日誌

記錄在啓動、運行、關閉時的錯誤信息,偶爾會給出解決方法,也記錄警告語正確信息。

3.2.2 binlog:二進制日誌

關於複製這部分,配置主從數據庫,可以查看另外一篇博客。

其餘部分看不明白。

 

3.2.3 slow query log:慢查詢日誌

1.設置一個時間的閾值,超過該閾值的SQL查詢會被記錄到 slow log中,供 DBA 優化。

2.一個相關的參數,表示SQL查詢是否使用索引,沒有使用的也會被記錄。

3.新的版本有一個表示每分鐘未使用索引的SQL被記錄的最大數目,一般無限制。

慢查詢日誌過大後,DBA使用 mysqldumpslow 命令查詢日誌的某些特定的記錄

新的版本建立了 slow_log 表格,使用的引擎不是 innodb。被建議使用MyISAM。

 

3.2.4 log:查詢日誌

 

3.3、套接字文件

此部分是關於網絡連接數據庫內容。

 

3.4、pid 文件

 

3.5、表結構定義文件

每個表都對應有文件

 

3.6、Innodb 存儲引擎文件

之前的都是數據庫本身的文件,後面的是關於存儲引擎的文件,包括   表空間  文件  與  重做日誌redo文件。

3.6.1 表空間文件:

 

一個表涉及到:idb獨立表空間文件、默認的共享表空間文件、.frm表結構定義文件。

3.6.2 redo log 文件:

寫入文件的過程:

 

此處不需要 double write  因爲寫入不會存在 也損壞的情況,情況磁盤IO的單位 512 bytes 遠小於 頁的大小。但是 redo 刷新到 磁盤的時候,是按照  512 字節的形式去刷新的,所以寫入一定是成功的。

 

其餘關於一些  關鍵  參數的空間,確定 redo 開啓的時期與其餘的級別空間已忽略。


總結:

時隔一個月的樣子了,有時間開始看 這本書的  第二遍,沒出細節都會去試驗一下,認識到了更深層的東西。繼續加油。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章