mysql innodb體系結構--初級
MySQL innodb體系結構
<!--more-->
2015年9月20日星期日 20:00—20:40,我觀看了博森瑞的關於mysql體系結構網路公開課,這次課程簡單介紹了innodb儲存引擎的一些內部結構,只是拋磚引玉,給大家開了頭,更多的內容還需要再學習,這些顯然是不夠的。
期待博森瑞的下次網路公開課。
上圖中的parse是查詢分析器元件。
Enterprise management services是管理服務和工具元件
mysql的體系結構包括server層和儲存層。其中server 層包含連線層和sql層。
下面來看客戶發出一條select語句經過的路徑。
1、一條sql先進記憶體池query cache(在oracle先進library cache,library 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進入儲存層,透過儲存引擎到最底層去提取資料,然後把資料返回給使用者。
innodb包含innodb buffer pool,buffer pool是決定資料庫效能的。
purge thread是用來管理undo資料的保留時間的(oracle是預設儲存undo 15分鐘)。
master thead 用來管理子執行緒,提醒子程式什麼時候去工作。
oracle花費74億美元收購Mysql,足以說明mysql的價值。
innodb log buffer就是redo log buffer。
一條sql先到記憶體中找資料,如果記憶體中沒有資料,就需要到磁碟上去找資料。在磁碟上找到資料後,再把資料快取到記憶體中,以便下次直接從記憶體中讀取資料。
資料真正儲存在頁中,當sql找到資料後,再把頁中資料放到記憶體中,頁中的資料進入記憶體中後,就叫 buffer了。簡單的說,資料在磁碟中叫page頁,把頁中資料放到記憶體中,就叫buffer了。記憶體是由一個一個buffer組成的。
記憶體中的buffer是由鏈(即chain)來管理
記憶體命中率:我們希望記憶體緩衝更多的熱資料。
innodb透過邏輯儲存單元(即段、區、頁)來儲存資料。
一個表就是一個段。
一個大段可以由4個區組成,一個區又是由64個連續的頁組成,一個頁是16k。
一張表就是一個段。所以一個區大概是1M(64*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 list把clean 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是單程式多執行緒的資料庫。
段、區、頁(oracle是塊)。
相關文章
- MySQL InnoDB儲存引擎體系結構MySql儲存引擎
- MySQL 5.6 InnoDB儲存引擎體系結構圖MySql儲存引擎
- MySQL 體系結構MySql
- MySQL-InnoDB內部結構MySql
- MySQL 一 體系結構MySql
- MySQL InnoDB的儲存結構總結MySql
- 資料結構(初級)資料結構
- 初級資料結構資料結構
- MySQL探祕(三):InnoDB的記憶體結構和特性MySql記憶體
- MySQL入門--體系結構MySql
- MySQL體系結構概覽MySql
- MySQL體系結構詳解MySql
- mysql_cluster體系結構MySql
- 【新炬網路名師大講堂】初識mysql的體系結構MySql
- 初識Oracle資料庫體系結構Oracle資料庫
- MySQL InnoDB表--BTree基本資料結構MySql資料結構
- 恢復MySQL InnoDB表結構的方法MySql
- MySQL體系結構圖詳解MySql
- Mysql技術內幕InnoDB儲存引擎讀書筆記--《一》Mysql體系結構和儲存引擎MySql儲存引擎筆記
- MySQL提升筆記(4)InnoDB儲存結構MySql筆記
- 【Mysql】InnoDB 引擎中的資料頁結構MySql
- MySQL-07.InnoDB資料儲存結構MySql
- 《MySQL 效能優化》之理解 MySQL 體系結構MySql優化
- MySQL體系結構與儲存引擎MySql儲存引擎
- MySQL體系結構詳細介紹MySql
- MySql體系結構和儲存引擎MySql儲存引擎
- MySQL體系結構及部署上線MySql
- MySQL Innodb 儲存結構 & 儲存Null值 解析MySqlNull
- mysql儲存引擎InnoDB詳解,從底層看清InnoDB資料結構MySql儲存引擎資料結構
- MySQL 讀書筆記 (一) 體系結構MySql筆記
- MySQL查詢select語句的執行流程以及InnoDB記憶體結構MySql記憶體
- MySQL體系架構MySql架構
- InnoDB資料頁結構
- MySQL的varchar儲存原理:InnoDB記錄儲存結構MySql
- MySQL InnoDB記憶體配置MySql記憶體
- Oracle體系結構之-記憶體結構Oracle記憶體
- 詳細瞭解 InnoDB 記憶體結構及其原理記憶體
- 【PG體系結構】PG體系結構簡單說明