这是一个 InnoDB 数据库。查询缓存大小为 1.2GB,缓存中有 300k 个查询。大多数缓存查询与 3 个主要表相关(总共 260MB 数据长度加上 600MB 索引长度)。每次我尝试在这 3 个表中插入新条目或更新现有条目时,MySQL 的速度就会大大减慢,就像服务器死机了一样。如果我在浏览器中打开我的网站,就会出现“超时”的情况。
我检查了 Munin 的统计数据,它显示 95% 的查询缓存在操作后被清除,所以我猜想突然的过载是由于向读取量大的表中插入条目造成的。在过载期间,Munin 只会在图表上显示一条白色条纹,因此您可以了解情况有多糟糕。
我该如何优化它?
答案1
答案2
如果您的表都是 InnoDB 格式,则应首先调整设置innodb_buffer_pool_size
。通常,我会将此值调整为系统内存的 80% 左右。另外,检查 的值innodb_flush_log_at_trx_commit
。如果将其设置为默认值1
,它将在每次事务提交时刷新,这会导致大量磁盘 I/O(这似乎是您所遭受的)。如果您不需要数据库 100% 符合 ACID 标准,则应将此值设置为0
或2
。以下是 MySQL 页面中的相关代码片段:
如果 innodb_flush_log_at_trx_commit 的值为 0,则每秒将日志缓冲区写入日志文件一次,并对日志文件执行刷新到磁盘的操作,但在事务提交时不执行任何操作。当值为 1 时,每次事务提交时将日志缓冲区写入日志文件,并对日志文件执行刷新到磁盘的操作。当值为 2 时,每次提交时将日志缓冲区写入文件,但不对其执行刷新到磁盘的操作。但是,当值为 2 时,每秒也会刷新日志文件一次。请注意,由于进程调度问题,每秒刷新一次并不能 100% 保证每秒都会发生。
我通常将其设置为2
。祝你好运!