MySQL?內存使用率常用分析語句(收藏版)
更新時間:2025年07月30日 14:58:04 作者:Hehuyi_In
用戶整理了MySQL內存占用過高的分析方法,涵蓋操作系統(tǒng)層確認及數據庫層bufferpool、內存模塊差值、線程狀態(tài)、performance_schema性能數據匯總和按用戶排序的內存分布分析,對MySQL?內存使用率相關知識感興趣的朋友一起看看吧
最近連續(xù)遇到MySQL內存占用過高導致服務器內存不足的問題,整理下收集到的常用分析語句。
關于MySQL內存使用率高問題排查過程以及解決方案,可以參考這篇文章。
一、 OS層
首先需要確認是否是MySQL占用的內存
top -p $(pidof mysqld) -n 1

或者
cat /proc/$(pidof mysqld)/status

二、 DB層
1. 全局情況
- 各種buffer pool大小,是否有明顯不合理的設置
SHOW GLOBAL VARIABLES LIKE '%buffer%szie%';

- MySQL總占用內存
SELECT * FROM sys.memory_global_total;

2. 內存占用詳情
- 按內存模塊
SELECT EVENT_NAME, CURRENT_NUMBER_OF_BYTES_USED AS memory_bytes, CURRENT_NUMBER_OF_BYTES_USED / 1024 / 1024 AS memory_mb FROM performance_schema.memory_summary_global_by_event_name WHERE CURRENT_NUMBER_OF_BYTES_USED > 0 ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC LIMIT 10;

- 各模塊內存使用變化(結果是累計值,可以根據差值觀察變化情況)
多次查詢,求差值
SELECT EVENT_NAME, SUM(SUM_NUMBER_OF_BYTES_ALLOC) / 1024 / 1024 AS total_memory_mb FROM performance_schema.memory_summary_global_by_event_name GROUP BY EVENT_NAME ORDER BY SUM_NUMBER_OF_BYTES_ALLOC DESC LIMIT 10;

- 按線程查看內存占用
SELECT m.EVENT_NAME, m.COUNT_ALLOC, m.CURRENT_NUMBER_OF_BYTES_USED AS mem_sum, (m.CURRENT_NUMBER_OF_BYTES_USED / 1024 / 1024.0) AS mem_sum_mb, t.NAME, t.TYPE, t.PROCESSLIST_ID, LEFT(t.PROCESSLIST_INFO, 10) FROM performance_schema.memory_summary_by_thread_by_event_name m JOIN performance_schema.threads t USING (THREAD_ID) WHERE t.PROCESSLIST_ID != CONNECTION_ID() ORDER BY m.CURRENT_NUMBER_OF_BYTES_USED desc LIMIT 10;

sys庫中的視圖基于 performance_schema 提供了更易讀和易用的性能數據匯總
SELECT * FROM sys.memory_by_thread_by_current_bytes LIMIT 10;

- 內存分布詳情
SELECT * FROM sys.memory_global_by_current_bytes order by current_alloc desc LIMIT 10;

- 按用戶排序
SELECT * FROM sys.memory_by_user_by_current_bytes;

到此這篇關于MySQL 內存使用率常用分析語句的文章就介紹到這了,更多相關MySQL 內存使用率內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mysql error:#1062 Duplicate entry ‘***′ for key 1問題解決方法
今天公司的一個網站突然提示MySQL Error Duplicate entry '96624' for key 1錯誤,經過分析這個問題是由于mysql表中的一個id自增長字段導致。2011-09-09

