在 MySQL 中,記憶體分配對於效能的影響非常大。隨著 MySQL 8.0 的引入,Performance Schema 和 sys 資料庫提供了更加豐富的工具來監控 MySQL 的記憶體消耗情況。透過這些工具,開發者可以輕鬆監控和分析 MySQL 的記憶體使用,從而進行優化。

1. 獲取 MySQL 總體記憶體消耗

要了解 MySQL 目前的記憶體消耗狀況,可以使用 sys 資料庫提供的 memory_global_total 表來快速檢視系統的整體記憶體使用量:

SELECT * FROM sys.memory_global_total;

這個查詢會顯示目前系統的記憶體總使用量,讓開發者對系統的整體消耗有一個基本的了解。

2. 獲取與代碼區域相關的詳細記憶體使用資訊

為了深入了解 MySQL 各個功能區域的記憶體分配情況,我們可以使用以下查詢來檢視不同代碼區域的記憶體消耗:

SELECT SUBSTRING_INDEX(event_name, '/', 2) AS code_area, 
       format_bytes(SUM(current_alloc)) AS current_alloc
FROM sys.memory_global_by_current_bytes
GROUP BY SUBSTRING_INDEX(event_name, '/', 2)
ORDER BY SUM(current_alloc) DESC;

這個查詢會按代碼區域進行分類,顯示每個區域的當前記憶體使用情況,幫助開發者識別出記憶體使用較多的區域,以進行進一步的優化。

3. InnoDB 緩衝池的記憶體分配

InnoDB 緩衝池是影響 MySQL 效能的核心部分。透過以下查詢,我們可以檢視 InnoDB 緩衝池的記憶體分配方式:

SELECT * FROM sys.memory_global_by_current_bytes 
WHERE event_name LIKE 'memory/innodb/buf_buf_pool%'\G

這將列出有關 InnoDB 緩衝池記憶體分配的詳細資料,包括當前分配量、高峰分配量等資訊,幫助開發者更好地理解和調整 InnoDB 緩衝池的配置。

4. 優化 InnoDB 緩衝池的啟動與關閉

為了加快 MySQL 的啟動速度,並減少系統重啟時的記憶體初始化時間,我們可以使用 InnoDB 緩衝池的熱啟動功能。這可以讓 MySQL 在關機時將緩衝池的內容寫入磁碟,在啟動時重新載入。這樣可以避免系統重新啟動後緩衝池的重新填充過程,從而提高系統效率。

要啟用這個功能,可以在配置文件中加入以下參數:

innodb_buffer_pool_dump_at_shutdown=1
innodb_buffer_pool_load_at_startup=1

這樣,在 MySQL 重啟時,緩衝池將自動加載之前的內容,大幅減少系統初始化時間,提升系統整體效能。

結論

透過 MySQL 的 Performance Schema 和 sys 資料庫,我們可以深入了解記憶體的分配和使用情況。從總體記憶體消耗到各個代碼區域的詳細使用,這些查詢提供了極大的靈活性來監控系統效能。此外,透過 InnoDB 緩衝池的優化配置,特別是啟用熱啟動功能,能夠顯著提升 MySQL 的效能,尤其是在系統重啟時。



按讚的人:

共有 0 則留言


大家好,我是Hank,一名全端工程師(Full Stack Engineer),專注於網路應用程式技術,包括但不限於APP、網站及LINE官方帳號的應用。過去12年都在新創公司擔任技術長與合夥人,目前是一位自由接案者,希望拓展更多可能性。同時我也是一個樂團的鼓手,擅長打爵士鼓,如果有玩音樂的朋友,歡迎互相交流。謝謝大家!