一,Mysql體系結構
資料庫 & 執行個體
資料庫:實體作業系統檔案和其他形式檔案類型的集合(frm、MYD、ibd)
執行個體:Mysql資料庫和背景線程以及一個共享記憶體區域組成。 資料庫執行個體才是真正用于操作資料庫檔案的!---表現形式:程序
關系:通常情況下可以認定為一個資料庫是對照一個執行個體的,但是也可以有一個資料對應多個執行個體的情況
Mysql組成部分:
連接配接池元件、管理服務和工具元件、SQL接口元件、查詢分析器元件、優化器元件、緩沖元件、插件式存儲引擎、實體檔案
Mysql存儲引擎:
1,InnoDB存儲引擎(高性能、高可用、高可擴充)
特征:行鎖設計、支援外鍵、非鎖定讀(預設讀取不會産生鎖)
2, MyISAM存儲引擎
特征:不支援事務、表鎖設計、支援全文索引。且緩沖池隻緩存了索引檔案,不緩沖資料檔案
組成: MYD & MYI
MYD用來存放資料檔案
MYI用來存放索引檔案
3, NDB引擎(叢集引擎)
4,Memory存儲引擎: 表中資料存放記憶體、臨時資料臨時表、采用哈希索引方式存儲,存儲速度很快
5,Archive存儲引擎: 存儲壓縮引擎,隻支援select & insert操作
6, FeDerated存儲引擎: 表資料存放非本地,遠端連接配接資料庫類引擎
7,Maria存儲引擎: 設計上用意取代MyISAM,支援事務
常用連接配接方式:
TCP/IP連接配接方式: mysql -h host -u david -p
命名管道和共享記憶體: 配置開啟 --enable-named-pipe
UNIX域套接字 --socket=/tmp/mysql.sock
--相關指令:
Mysql程序情況檢視: ps -ef|grep mysqldb
Mysql檢視配置檔案位置資訊: mysql --help | grep my.cnf (按照從左到右 的順序覆寫讀取)
Mysql資料庫檔案存放路徑: show variables like 'datadir'
Mysql目前使用的引擎: show engines
建立表指定使用引擎: create table tableName Engine=XXX
二、InnerDB體系架構
記憶體池:
InnerDB有很多的記憶體塊,可以認定為這些記憶體塊組成了記憶體池
作用:
1,維護所有的程序、線程需要通路的多個内部資料結構
2,緩存磁盤上的資料,友善快速的讀取,同時在對磁盤修改的之前進行緩存
3,重做日志緩沖
1,緩沖池
a,基于磁盤的資料,從磁盤中讀取到的頁會先放在緩沖池中,下一次重複讀取時從緩沖池中讀取,如果緩沖池沒有
從磁盤資料頁中讀取到緩沖池,減少讀取磁盤的次數,減少IO次數提高資料庫性能
b,緩沖池的大小==》直接影響了資料庫的整體性能
c,緩沖池執行個體通常情況下也會有多個,這裡類似Redis的做法,通過hash索引判斷讀取到的資料應該錄入到哪一個緩沖池中
多個緩沖池執行個體就好比Java中的HashMap數組定位的模式,多個緩沖池,在叢集的情況下,平均的配置設定做到負載均衡,若
當機資料丢失範圍減少。預設情況下緩沖池執行個體為一個。
緩沖池中的資料頁類型
1,索引頁
2,資料頁
3,undo頁
4,插入緩沖
5,自适應哈希索引
6,Innodb存儲的鎖資訊
7,資料字典資訊
緩沖池與LRU算法:
緩沖池通過LRU算法來進行管理,簡單的來說使用頻繁的資料放在LRU清單的前端,使用少的資料放在尾端,當緩沖池滿了,
不能讀取資料的時候,首先釋放LRU尾端的資料
LRU算法與優化:
I,通常情況下一個資料被通路,隻是因為目前場景因素并不是熱點資料,那麼被放到LRU清單的前列,就起不到應有的作用,
相反還可能會導緻熱點資料被頻繁刷出,是以Mysql對于通路的資料并不是直接刷到LRU清單的前列,而是放在LRU清單midPoint
位置,這個诶之的長度預設為LRU長度的5/8處。,通過innodeb_old_blocks_pct控制,但是問題是被通路了多少次才能被
當做成熱點資料?通過設值innodb_old_blocks_pct的大小來設通路次數,預設次數為20次
II,為了防止無資料記憶體頁一開始大量的建立,LRU隊列一開始空的,在Free清單中存放着可以使用的頁,每次從Free清單中查找空閑的
頁,然後存入資料放入到LRU清單中去。midpoint之前的為new清單,之後的為old清單
III,對于緩沖池中頁大小申請,向上申請與拆分,需要一個4kb的頁,但是Free清單隻有16kb的頁,則将16kb的頁分成 8kb+4kb+4kb的模式提供
頁的上一層是歸屬于某個表空間,表空間為NULL,表示該頁歸屬于系統表空間
通過 show engine innodb status
例子:
Buffer Pool size 327679
Free buffers 0 --> 無空閑頁
Database pages 307717 -->LRU清單中頁的數量
Old database pages 113570 --> old清單中頁的數量
Modified db pages 24673 --> 髒頁的資料
...
Pages made young 6448526, not young 0 --> 移動到LRU清單前端的頁是為6448526,也就是資料轉換為熱點資料的次數,代表的是一個狀态值非實時正在進行的值
Buffer pool hit rate 1000/1000 ...-->緩沖池命中率,通常情況下不應該小于百分之95%
2,重做日志緩沖池
3,額外的記憶體池(記憶體管理等等)
背景線程:
主要作用:負責重新整理記憶體池中的資料,保證緩沖池中的記憶體緩存是最近的資料
背景線程:(多線程模型)
1,master Thread
負責緩沖池中的資料 異步 重新整理,保證資料的一緻性(包括髒頁的重新整理,合并插入緩沖)
2,IO Thread(讀寫線程)
使用AIO的方式處理IO請求,提高資料庫的性能
分4種類線程: write,read,insert buffer, log IO Thread
3,Purge Thread
事務送出後,回收undo頁,預設數量為1,可以設定多個提高Undo頁回收效率
4,Page Cleaner Thread
将之前版本的髒頁重新整理到單獨的線程中執行、減輕Master Thread 的壓力
--相關指令:
檢視IO Thread各類型線程的數量: show variables like 'innodb_%io_threads'
觀察IO Thread使用狀況: show engine innodb status(顯示的不是目前時間的狀态,而是過去某個時間段的時間誤差允許範圍内的狀态)
檢視緩沖池大小: show variables like 'innodb_buffer_pool_size'
檢視緩沖池執行個體個數: show variables like 'innodb_buffer_pool_instances'