3 mysql底層解析——innodb文件系統初步入門,包括連接、解析、緩存、引擎、存儲等

上一篇我們學習了server層對於表對象緩存的處理,表對象獲取到之後,通過handler才具備了與存儲引擎交互的能力。那麼存儲引擎層又是怎麼個流程呢?

mysql文件結構

這些文件都可以在文件目錄中找到,我們來看看都是做什麼的。

my.cnf,大家都懂。

slow.log,記錄慢查詢日誌,當語句執行時間超過參數long_query_time的值時,會被記錄到該log,需要開啓配置後纔有。

error.log,記錄錯誤和警告信息。

general.log,記錄所有在數據庫上執行的語句,可以用來追蹤問題,文件增長很快,也很大,一般不會打開,偶爾要調試時可以打開。

系統默認庫有4個,具體是幹什麼的自行查詢,做過元數據的應該比較熟悉,有一些框架就是根據元數據來完成的,譬如eova。沒做過也不要緊,大概理解爲存儲系統信息的,譬如你的表名、列名、列屬性等等。

innodb文件結構

大圖裏面黑框裏的就是innodb的東西了。

有兩個默認的日誌文件,logfile0和logfile1,大小可以手工設定。

如果你創建了一個數據庫userdb,並且創建了幾個表,你可以在數據目錄看一下。

每個表會對應一個frm文件,一個ibd文件。frm文件是表結構,ibd是數據。如果你想讓兩個表共用一個數據文件的話,就像最上面圖中那樣t2、t3共用一個ibdata,可以通過innodb_file_per_table控制。還有一個db.opt文件,這個存儲的是mysql的一些配置信息,如編碼、排序的信息,如果在創建數據庫時指定了一些非默認參數的話,也會存到該文件。

這裏,我們要講一個知識點了,ibd文件。

上面說了,ibd就是存表數據的,那麼在計算機裏,所有的存儲都是有最小存儲單元的。在磁盤上,最小的單元是扇區,一個扇區是512字節,操作系統中最小單元是塊(block),最小單位是4K,而innodb也有自己的最小存儲單元——頁(page),一頁是16K。

這意味着什麼呢,你一個文件放到電腦上,哪怕它是空的,也要佔用4K,它佔用的空間永遠是4K的整數倍。

你可以去查看每個ibd文件的大小,它永遠是16384(16k)的整數倍。

這個希望記好了,它對將來理解索引已經加載表數據都是非常有用的。形成一個基本概念,mysql的數據最小是16K,也就是哪怕你只取一條,可能還不到1K,那麼mysql也會取出16K的數據。因爲“頁”是最小單位。“頁”還決定了b+ tree在某個高度下,能存放的數據量,學完後就能明白爲什麼一個表存2萬數據,和存1500萬數據,查詢速度一樣。大家可以看我這一篇,來更深入理解一下《 InnoDB一棵B+樹可以存放多少行數據?

innodb體系結構

innodb的體系結構還是比較清晰的,做爲一個支持事務、索引、異常恢復及性能優異的數據引擎,靠的就是上面的體系架構。

目前我們已經知道的就是Handler API是供mysql server層調用的,server層定義了一些接口,譬如insert、delete,具體怎麼實現,是由每個存儲引擎自己實現的。其他的,剛學了ibd文件是存數據的。其他的,後面慢慢學。

簡單說明

以上圖中間虛線爲分界,上面的是邏輯層,每個訪問都會產生事務,事務處理會產生鎖(表鎖、行鎖),操作對象是表、索引、b+ tree。對數據頁面的訪問需要物理事務,爲了讀寫一致性,需要讀寫鎖(物理鎖)。爲了高效定位和管理“頁”,需要用到文件管理系統。

這些都是基於邏輯的處理,再往下就是物理層了。

首先我們知道,在邏輯處理和磁盤文件之間,都是有一層緩存的,這裏主要是日誌緩衝區和innodb_buffer_pool。和其他大家常用的kafka、elasticsearch、rocksDB等等一樣,要保持性能,必然都遵循相同或類似的規則,那就是寫pageCache、順序寫磁盤,這是決定任何一個帶存儲功能的性能的關鍵點。

請務必記着innodb_buffer_pool,未來能對性能起決定性作用的一個重要因子。要明白,任何時候,決定讀寫速度的都是內存,只要你要讀的數據在內存裏,它就比在磁盤上快。redis就是靠內存,mysql的數據緩存,就取決於innodb_buffer_pool。

緩衝層提供了高效的讀寫性能,再下面就是物理文件層了,是落到磁盤上的。

磁盤上重要的地方有REDO日誌,和表數據(頁)

 

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