1. <i id="s6b2k"><small id="s6b2k"></small></i>
    <b id="s6b2k"><bdo id="s6b2k"></bdo></b>
  2. <wbr id="s6b2k"></wbr>

    詳解MySQL InnoDB存儲引擎的內存管理_Mysql

    來源:腳本之家  責任編輯:小易  

    存儲引擎之內存管理

    在InnoDB存儲引擎中,數據庫中的緩沖池是通過LRU(Latest Recent Used,最近最少使用)算法來進行管理的,即最頻繁使用的頁在LRU列表的最前段,而最少使用的頁在LRU列表的尾端,當緩沖池不能存放新讀取到的頁時,首先釋放LRU列表尾端的頁。

    上面的圖中,我使用8個數據頁來表示隊列,具體作用,先賣個關子。在InnoDB存儲引擎中,緩沖池中頁的默認大小是16KB,LRU列表中有一個midpoint的位置,新讀取到的數據頁并不是直接放入到LRU列表的首部,而是放入到LRU列表的midpoint位置,這個操作稱之為midpoint insertion stategy,也叫中間點插入策略。在默認配置下,該位置在LRU長度的5/8處,這也就是上面使用8個數據頁的作用。下面的圖示意了新的數據頁的插入過程:

    mitpoint的位置可通過參數innodb_old_blocks_pct控制,如下:

    mysql> show variables like 'innodb_old_blocks_pct';
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | innodb_old_blocks_pct | 37    |
    +-----------------------+-------+
     row in set (. sec)

    從上面的例子看出,結果是37,這個37意味著新讀取的頁將被插入到大概距離LRU列表尾端37%的位置,差不多3/8的位置,在InnoDB存儲引擎中,midpoint之前的頁稱為new列表,后面的頁稱之為old列表,new列表中的頁是最為活躍的數據。

    為什么不直接把數據頁放在LRU隊列的首部?

    之所以不把新讀取的數據頁放在LRU隊列的首部,是因為某些全表掃描的SQL操作可能會將所有的熱點數據都刷新出LRU隊列,導致下一次訪問熱點數據的時候,必須從磁盤中取相應的數據,從而影響緩沖池的效率。為了解決這個問題,InnoDB使用另外一個參數來管理LRU列表,就是innodb_old_blocks_time,用于表示頁讀取到midpoint之后,多久才會加入到LRU列表的熱端。因此當需要執行上述所說的SQL操作時,可以通過下面的方法盡可能使LRU列表中的熱點數據不被刷出。

    mysql> set global innodb_old_blocks_time=;
    Query OK,  rows affected (0.00 sec)

    這表示在1000s之后,才允許這些數據刷新到LRU列表的熱端。

    如果在實際情況中,數據頁活躍的比率不止63%,用戶還可以通過設置innodb_old_blocks_pct來減少熱點頁可能被刷出的概率。

    mysql> set global innodb_old_blocks_pct=;                                                                                                     
    Query OK,  rows affected (0.00 sec)

    當數據庫剛啟動時,LRU的內容是空的,這個時候,所有的數據頁都放在Free列表中,當需要從緩沖池中分頁時,首先從Free列表中查找是否有可用的Free頁,如果存在,則將該頁從Free頁中刪除,然后放入到LRU的列表中。淘汰掉LRU列表末尾的數據頁,將該內存空間分配給新的頁。這個過程的流程圖如下:

    當LRU列表中的頁從old部分加入到new部分時,稱此時發生的操作是page made young,而因為innodb_old_blocks_time的設置而沒有從old部分移動到new部分的操作稱之為page_not_made young。可以通過show engine innodb status來觀察LRU列表以及Free列表的使用情況和運行狀態。

    mysql> show engine innodb status\G
    ***
    ***
    ----------------------
    BUFFER POOL AND MEMORY
    ----------------------
    Total large memory allocated 
    Dictionary memory allocated 
    Buffer pool size   
    Free buffers       
    Database pages     
    Old database pages 
    Modified db pages  
    Pending reads      
    Pending writes: LRU , flush list , single page 
    Pages made young , not young 
    0.00 youngs/s, 0.00 non-youngs/s
    Pages read , created , written 
    0.00 reads/s, 0.00 creates/s, 0.00 writes/s
    No buffer pool page gets since the last printout
    Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
    LRU len: , unzip_LRU len: 
    I/O sum[]:cur[], unzip sum[]:cur[]
    --------------
    ROW OPERATIONS
    --------------
     queries inside InnoDB,  queries in queue
     read views open inside InnoDB
    Process ID=, Main thread ID=, state: sleeping
    Number of rows inserted , updated , deleted , read 
    0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
    ----------------------------
    END OF INNODB MONITOR OUTPUT
    ============================
    
     row in set (0.00 sec)

        從上面的結果可以看到:當前buffer pool size總共有8191個頁,每個數據頁的大小是16k,總共的大小是8191*16k=128M的緩沖池,其中Free buffers表示當前Free列表中頁的數量。page made young顯示了LRU列表中頁移動到前端的次數,因為該服務器在運行階段沒有改變innodb_old_blocks_time的值,因此not young為0,youngs/s、non_youngs/s表示每秒這兩類操作的次數。

        InnoDB存儲引擎從1.0.x版本開始支持壓縮頁的功能,即將原本16kb的數據頁壓縮成1KB、2KB、4KB和8KB。對于非16KB的頁,是通過unzip_LRU來管理的,上述命令中的第22行就顯示了壓縮頁和非壓縮頁的信息。

    需要注意的一點是Free buffers的值與Database Pages的值之和不一定等于buffer pool size,因為緩沖池中的頁可能還會被分配各自適應哈希索引、鎖信息等頁,而這部分頁并不需要LRU算法進行維護。

    臟頁

         在LRU列表中的頁被修改之后,這個頁就稱之為“臟頁”,即緩沖池中的數據頁和磁盤上的數據產生了不一致,緩沖池的數據比較新,這時數據庫會通過checkpoint機制將臟頁刷新回磁盤,而Flush列表中的頁也就是臟頁列表,臟頁既存在于LRU列表中,也存在與Flush列表中,LRU列表用來管理緩沖池中頁的可用性,Flush列表用來管理將頁刷新回磁盤,二者不影響。Flush列表也可以通過show engine innodb status來查看,前面的結果列表中的第13行,modified db pages就是當前的臟頁數量,用戶可以通過元數據表INNODB_BUFFER_PAGE_LRU表來查看。

    以上就是詳解MySQL InnoDB存儲引擎的內存管理的詳細內容,更多關于InnoDB 內存管理的資料請關注真格學網其它相關文章!

    您可能感興趣的文章:MySql優化之InnoDB,4GB內存,多查詢的my.ini中文配置方案詳解簡述MySQL InnoDB存儲引擎MySQL 學習總結 之 初步了解 InnoDB 存儲引擎的架構設計MySQL學習(七):Innodb存儲引擎索引的實現原理詳解MySQL存儲引擎MyISAM與InnoDB區別總結整理MySQL InnoDB存儲引擎的深入探秘詳解分析MySQL8.0的內存消耗MySQL 內存表和臨時表的用法詳解MySQL8.0內存相關參數總結MySql減少內存占用的方法詳解

  3. 本文相關:
  4. mysql的日期和時間函數
  5. centos6.5編譯安裝mysql 5.7.14詳細教程
  6. mysql中自增auto_increment功能的相關設置及問題
  7. 編寫腳本令xtrabackup對mysql數據進行備份的教程
  8. mysql5.6 數據庫主從同步安裝與配置詳解(master/slave)
  9. mysql 5.0.67最新版替代mysql 5.0.51b版本官方下載
  10. mysql/java服務端對emoji的支持與問題解決方法詳解
  11. 用命令創建mysql數據庫(de1)的方法
  12. 正確理解mysql中的列索引和多列索引
  13. mysql筆記之運算符使用詳解
  14. MySQL技術內幕:InnoDB存儲引擎的介紹
  15. 如何開啟mysql innodb存儲引擎
  16. MySQL技術內幕:InnoDB存儲引擎的目錄
  17. Mysql中為什么使用InnoDB存儲引擎的時候建議關閉回...
  18. Mysql數據庫3種存儲引擎有什么區別?
  19. Mysql中什么是存儲引擎
  20. Mysql Innodb存儲引擎 select count 太慢,怎么優化
  21. 安裝以后mysql數據庫沒有innodb存儲引擎怎么辦
  22. 騰訊試題 innodb存儲引擎是mysql 請問下述兩個查詢...
  23. 我在看MySQL InnoDB存儲引擎的資料中,發現有一個...
  24. 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess數據庫文摘數據庫其它首頁mysql優化之innodb,4gb內存,多查詢的my.ini中文配置方案詳解簡述mysql innodb存儲引擎mysql 學習總結 之 初步了解 innodb 存儲引擎的架構設計mysql學習(七):innodb存儲引擎索引的實現原理詳解mysql存儲引擎myisam與innodb區別總結整理mysql innodb存儲引擎的深入探秘詳解分析mysql8.0的內存消耗mysql 內存表和臨時表的用法詳解mysql8.0內存相關參數總結mysql減少內存占用的方法詳解mysql的日期和時間函數centos6.5編譯安裝mysql 5.7.14詳細教程mysql中自增auto_increment功能的相關設置及問題編寫腳本令xtrabackup對mysql數據進行備份的教程mysql5.6 數據庫主從同步安裝與配置詳解(master/slave)mysql 5.0.67最新版替代mysql 5.0.51b版本官方下載mysql/java服務端對emoji的支持與問題解決方法詳解用命令創建mysql數據庫(de1)的方法正確理解mysql中的列索引和多列索引mysql筆記之運算符使用詳解mysql安裝圖解 mysql圖文安裝教程can""""t connect to mysql servwindows下mysql5.6版本安裝及配置mysql字符串截取函數substring的mysql創建用戶與授權方法mysql提示:the server quit withmysql——修改root密碼的4種方法mysql日期數據類型、時間類型使用mysql之timestamp(時間戳)用法mysql update語句的用法詳解mysql查詢結果復制到新表的方法(更新、插mysql 批量更新與批量更新多條記錄的不同c#實現mysql命令行備份和恢復windows10 64位安裝mysql5.6.35的圖文教程詳解mysql實現主從復制過程mysql 常見數據拆分辦法在docker中使用mysql的教程mysql 5.7.13 安裝配置方法圖文教程(win1mysql入門(五) mysql中的索引詳講mysql replace函數替換字符串語句的用法
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.yu113.com All Rights Reserved
    战天txt全集下载