慢的根源:内存和磁盘差着一万倍参数一:buffer pool,读性能的总开关buffer pool 设多大才不算浪费参数二:redo log,写性能的安全备忘录备忘录设大了设小了都不行动手改参数的正确姿势
你大概率遇到过这种场景:项目刚上线时查询嗖嗖快,过了半年用户量上来了,同样的接口越来越慢,DBA 看了一眼,改了个配置,速度直接回来了。你凑过去问改了啥,对方轻描淡写一句「就调了两个参数」。
打开 MySQL 的配置文件,几百个参数排山倒海地扑过来,难道都要背下来?其实不必。做了多年数据库运维的老手们有个共识:真正决定性能天花板的就是两个参数——一个管「读」,一个管「写」。今天就用大白话,把这两个参数掰开讲透。
先说结论:MySQL 慢,十有八九不是 CPU 不够强,而是数据在内存和磁盘之间来回搬运太频繁。内存的访问速度比机械磁盘快几个数量级,哪怕和 SSD 比,也依然快得多。
数据库的日常就是不停地查数据、改数据。如果每次都要去磁盘上翻文件,那再强的机器也扛不住。所以 MySQL 的优化思路特别朴素:能放内存里的,尽量别去磁盘拿。而「放多少、怎么放」,正是下面这两个参数说了算。
第一个参数叫 innodb_buffer_pool_size,是 InnoDB 存储引擎最重要的配置,没有之一。你可以把它理解成 MySQL 租下来的一间内存工作间:数据表和索引在使用时,都会先搬进这个工作间。
查询来了以后,MySQL 的动作顺序是这样的:先在工作间里找,找到了(术语叫缓存命中)直接返回,速度飞快;没找到,才不情不愿地去磁盘上读,读完了顺手再搬进工作间,方便下次用。
所以这个参数的逻辑非常直接:工作间越大,能留在内存里的数据越多,去磁盘跑腿的次数就越少,查询自然就快。对读多的业务来说,把它调大,往往是性价比最高的一次优化。
原则只有一句话:在给操作系统和其他程序留够内存的前提下,尽可能给大。给太小,等于花钱买了大内存却让数据库挤在角落里干活;给太满,操作系统自己都没内存可用,反而会拖垮整台机器。
再细分两种情况:
- •数据库专用机:这台服务器只跑 MySQL,没有别的大应用,可以直接给到总内存的 70% - 80%
- •混合部署机:同一台机器还跑着 Web 服务、监控程序等,建议保守一点,控制在 50% - 60%
第二个参数叫 innodb_log_file_size,管的是重做日志(redo log)每个文件的大小。如果说 buffer pool 决定「读」的上限,那它就决定「写」的上限。
它的机制可以比作一本安全备忘录。每次修改数据时,InnoDB 并不直接把改动写到磁盘上真正的数据文件里——那样是东一块西一块的随机写,速度很吃亏。它先把改动用顺序写的方式,飞快地记进备忘录里,然后再慢慢把数据刷回磁盘。
这么设计一举两得:一是把慢速的随机写换成了高速的顺序写,写入性能直接起飞;二是数据库万一崩溃,重启时可以翻着备忘录,把还没来得及落盘的改动重做一遍,保证数据一条不丢。
这本备忘录是循环使用的:写满一圈就回头覆盖最早的部分。但在覆盖之前,MySQL 会先执行一次检查点(Checkpoint),确认对应的数据页已经安全落盘,才敢动手覆盖。
这个参数的设置,本质是在写入性能和恢复速度之间找平衡点。两种极端都不行:
经验法则是:让所有重做日志加起来,能装下业务高峰期大约一小时的写入量。不同业务可以参考这张表:
偷懒方案也有:在 MySQL 8.0 里打开 innodb_dedicated_server 参数,让数据库根据内存大小自动配。
buffer pool 改完重启就生效,但 redo log 文件大小属于「动了就要按流程来」的参数,乱改可能导致 MySQL 起不来。完整步骤一共四步:
动手前还有三个坑提前避一下:
- •先备份再动手:改日志参数前务必确认数据已有备份,配置文件本身也先拷一份
- •挑业务低峰期操作:停库期间服务是不可用的,别在高峰期硬来
- •改完要观察:重启后盯着错误日志跑一两天,确认没有异常告警再收工
总结一下:MySQL 调优听起来高深,但核心就两招——buffer pool 管读,redo log 管写。前者在内存允许的范围内尽量给大,后者按高峰期一小时写入量来定。把这两个参数调对,你的数据库性能就赢下了大半,剩下的才是慢慢抠细节。
你的 MySQL 是自己配的参数还是默认一路跑?调参过程中踩过什么坑?评论区聊聊。关注不迷路,明天见。
热门跟贴