天天看點

MySql InnoDB體系結構一,Mysql體系結構二、InnerDB體系架構

一,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體系架構

MySql InnoDB體系結構一,Mysql體系結構二、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'

繼續閱讀