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视图查看内存分配详情,定位高内存消耗的操作。