MySQL 内存配置直接影响查询响应、并发承载和稳定性,关键不是堆大内存,而是合理分配给核心组件:缓冲池(InnoDB)、连接线程、临时表、排序缓存等。盲目调高可能引发系统OOM或反向拖慢性能。
重点配好 innodb_buffer_pool_size
这是 MySQL 最关键的内存参数,建议占物理内存的 50%–75%(专用数据库服务器场景)。它缓存表数据和索引,命中率高可大幅减少磁盘 I/O。
查看当前使用情况:SHOW ENGINE INNODB STATUS\G 中关注 Buffer pool hit rate(理想 >99%) 动态调整(无需重启):SET GLOBAL innodb_buffer_pool_size = 4294967296;(示例设为 4GB) 若实例常驻小表且内存紧张,可略低于 50%,但不建议低于 1GB(除非测试环境)控制每个连接的内存开销
每个客户端连接会独占部分内存,大量短连接易导致内存耗尽。需限制单连接资源,并配合连接池使用。
sort_buffer_size:非全局共享,每个需要排序的查询单独分配,建议设为 256K–2M(勿超 4M) read_buffer_size 和 read_rnd_buffer_size:类似,按需设为 256K 即可 tmp_table_size 和 max_heap_table_size:需保持相等,控制内存临时表上限,建议 64M–256M;超限自动转磁盘临时表(慢) 用 SHOW STATUS LIKE 'Created_tmp%'; 观察 Created_tmp_disk_tables,若频繁出现,说明临时表常落盘,可适当调高上述两值合理设置最大连接与线程缓存
max_connections 不是越大越好。每个连接至少消耗 256KB–2MB 内存(取决于其他 buffer 设置),过高易压垮系统。
先评估实际并发量(如应用连接池 size × 1.5),再设 max_connections,生产环境常见 200–1000 开启 thread_cache_size 减少频繁创建/销毁线程开销,公式参考:sqrt(max_connections),通常设为 4–16 观察 Threads_created 状态变量,若持续上升,说明缓存不足,可适度调高