innodb_buffer_pool_size是InnoDB存儲引擎的核心內存參數,用于緩存表數據和索引,直接影響磁盤I/O和查詢性能。建議將其設置為服務器物理內存的50%-80%(專用數據庫服務器可提升至90%)。例如,16GB內存服務器可設置為8-12GB。調整后需通過以下命令監控命中率(理想值≥95%):
SELECT (1 - (SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_reads') /
(SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_read_requests')) * 100
AS buffer_pool_hit_ratio;
若命中率低于95%,需逐步增加該參數值(每次增加1-2GB)直至達標。
key_buffer_size用于MyISAM存儲引擎的索引緩存。若主要使用InnoDB,可將其設置為256M-512M(避免占用過多內存);若仍有MyISAM表且頻繁訪問,可適當調高(如1GB),但需監控內存使用情況。
max_connections決定MySQL允許的最大并發連接數,每個連接都會占用內存(約2-4MB/連接)。建議根據應用負載設置為100-500(避免設置過高導致內存耗盡)。若需支持更多并發,推薦使用連接池(如HikariCP),減少連接創建和銷毀的開銷。
tmp_table_size和max_heap_table_size控制內存中臨時表的最大大小。若查詢頻繁創建臨時表(可通過SHOW GLOBAL STATUS LIKE 'Created_tmp_tables'查看),需適當增加這兩個參數值(如64M-256M),避免臨時表轉換為磁盤表(性能下降)。需注意:兩者值需保持一致。
sort_buffer_size(排序緩沖區)、join_buffer_size(連接緩沖區)、read_buffer_size(讀緩沖區)分別用于排序操作、表連接和順序讀取。建議根據查詢特征適度調整(如2M-8M/參數),避免設置過大(單個連接占用過多內存)。例如,若查詢頻繁排序,可將sort_buffer_size設置為4M。
query_cache_size用于緩存查詢結果,但在高并發寫入場景下會成為瓶頸(每次寫入需清空緩存)。MySQL 8.0已移除該功能,若使用5.x版本,建議:
Qcache_hits(命中率)和Qcache_inserts(插入次數),若命中率低于70%,建議禁用。SHOW ENGINE INNODB STATUS查看InnoDB內存狀態,SHOW GLOBAL STATUS LIKE 'Memory%'查看全局內存使用情況;top/htop觀察MySQL進程的RES(常駐內存)變化,若持續增長,可能存在內存泄漏(需檢查SQL語句或應用代碼)。Swap會顯著降低MySQL性能(磁盤I/O遠慢于內存)。建議通過以下命令調整swappiness參數(降低系統使用Swap的傾向):
echo 'vm.swappiness = 10' >> /etc/sysctl.conf
sysctl -p
設置為10(默認60)表示系統僅在內存不足10%時使用Swap。
定期執行OPTIMIZE TABLE(針對MyISAM表)或ALTER TABLE ... FORCE(針對InnoDB表),整理表碎片、釋放空間,減少內存占用。例如:
OPTIMIZE TABLE large_table;
或
ALTER TABLE large_table FORCE;
建議每月執行一次,或在大量數據刪除/更新后執行。
perl mysqltuner.pl);pt-variable-advisor(參數顧問)、pt-query-digest(查詢分析)等工具,幫助識別內存瓶頸;performance_schema.memory_summary_global_by_event_name視圖查看內存分配詳情,定位高內存消耗的操作。