mysql innodb體系結構--初級

czxin788發表於2015-09-21

 

MySQL innodb體系結構

<!--more--&gt

 

2015920日星期日 20:0020:40,我觀看了博森瑞的關於mysql體系結構網路公開課,這次課程簡單介紹了innodb儲存引擎的一些內部結構,只是拋磚引玉,給大家開了頭,更多的內容還需要再學習,這些顯然是不夠的。

                   期待博森瑞的下次網路公開課。

 

mysql innodb體系結構--初級

 

mysql innodb體系結構--初級

 

上圖中的parse是查詢分析器元件。

Enterprise management services是管理服務和工具元件

 

 

mysql的體系結構包括server層和儲存層。其中server 層包含連線層和sql

 

         下面來看客戶發出一條select語句經過的路徑。

1、一條sql先進記憶體池query cache(在oracle先進library cachelibrary cache裡面會快取這條sql語句的執行計劃)。在mysql query cache中,先判斷這個sql語句在query cache裡面有沒有快取。如果有快取,那麼還要判斷這條sql有沒有許可權訪問資料庫(mysql.user表判斷,即使用者名稱密碼是否對等),如果有許可權,直接把記憶體中的結果返回給使用者。

2、如果query cache沒有這個sql。那麼這個sql就進入解析器(因為計算機只認識二進位制語言,而不認識select這種文字語言,所以需要mysql的解析器把sql文字語句解析成計算機認識的二進位制語言,即解析數)

         3、然後這條sql進入預處理環節,用來處理解析器沒有把sql解析好的,預處理再把這樣的sql重新處理一下。

         4、然後sql進入查詢最佳化器,在此環節對sql語句中的join,排序進行最佳化。

         5、然後透過程式的api介面呼叫這條sql

         6、最後sql進入儲存層,透過儲存引擎到最底層去提取資料,然後把資料返回給使用者。

 

mysql innodb體系結構--初級

mysql innodb體系結構--初級

 

innodb包含innodb buffer poolbuffer pool是決定資料庫效能的。

purge thread是用來管理undo資料的保留時間的(oracle是預設儲存undo 15分鐘)。

 

master thead 用來管理子執行緒,提醒子程式什麼時候去工作。

oracle花費74億美元收購Mysql,足以說明mysql的價值。

mysql innodb體系結構--初級

 

innodb log buffer就是redo log buffer

一條sql先到記憶體中找資料,如果記憶體中沒有資料,就需要到磁碟上去找資料。在磁碟上找到資料後,再把資料快取到記憶體中,以便下次直接從記憶體中讀取資料。

資料真正儲存在頁中,當sql找到資料後,再把頁中資料放到記憶體中,頁中的資料進入記憶體中後,就叫 buffer了。簡單的說,資料在磁碟中叫page頁,把頁中資料放到記憶體中,就叫buffer了。記憶體是由一個一個buffer組成的。

記憶體中的buffer是由鏈(即chain)來管理

記憶體命中率:我們希望記憶體緩衝更多的熱資料。

 

innodb透過邏輯儲存單元(即段、區、頁)來儲存資料。

一個表就是一個段。

一個大段可以由4個區組成,一個區又是由64個連續的頁組成,一個頁是16k

一張表就是一個段。所以一個區大概是1M64*16k=1M),一個段大概是4M

頁是Mysql  innodb儲存引擎 i/o的最小單位。

 

頁裡包含頁頭,頁中,頁尾。

頁頭包含事務資訊,指標資訊。

把頁資訊對映到記憶體的buffer。一個buffer包含前後指標的資訊,能夠透過後一個指標去找下一個buffer。所以我們就可以根據連結串列結構把buffer串起來。

 

innodb是雙向連結串列(即buffer前後都有指標),把buffer串起來。

 

buffer有三種狀態:

a、  free,從來沒有被用過的buffer

b、  clean,乾淨的,磁碟上的資料和記憶體buffer中的資料是完全一樣的;

c、  dirty,記憶體buffer中的資料和磁碟資料不一致,即記憶體buffer中的資料還沒來得及刷到磁碟中。

 

mysql的零碎知識點太多了,但是入門簡單。

 

 當然,鏈也有三種狀態:

a、  free list(針對free buffer來說),這種鏈會把從來沒有使用過的buffer給串起來(不過,對於生產中跑起來的資料庫,基本不存在free list了);

b、  lru list(針對clean buffer來說的),該鏈是用來串和磁碟資料一樣的buffer。在lru list會把最近最少使用的放在lru連結串列中。我們知道,有的資料經常被訪問,有的資料是很少被訪問。那麼,對於很少被訪問的buffer可以被新進來的buffer資料覆蓋掉。所以,可以用lru listclean buffer串起來。在lru list上的是clean buffer,這些buffer可以被新buffer資料覆蓋,以迴圈使用記憶體空間。

c、  flush list (針對dirty buffer來說的) flush list上放的是髒塊,用來告訴哪些buffer該重新整理到磁碟上了。write thread會到flush list上去找哪些buffer該刷到磁碟上了。flush list也分為最近最少被髒的。資料庫會把最近最少使用的髒資料掛到flush list上,等資料庫不繁忙的時候,write thread就會把flush list上的髒塊寫到磁碟上。

 

以上是三種buffer狀態和三種連結串列狀態。

 

innodb三大特性也在記憶體池中。

不要小看mysql資料庫。

mysql innodb體系結構--初級

 

mysql innodb體系結構--初級

 

mysql是單程式多執行緒的資料庫。

mysql innodb體系結構--初級

 

 

mysql innodb體系結構--初級

 

段、區、頁(oracle是塊)。

        

 



mysql innodb體系結構--初級
請登入後發表評論 登入
全部評論

相關文章