最近几个站点出现负载过高,磁盘IO过高,通过iotop命令查看,发现进程为mysqld的读数据操作很高。基本上在200MB/s。已经到达了100%了。
在网上找了好几天都是说binglog提交,
set global sync_binlog=500;
当每进行500次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
set global innodb_flush_log_at_trx_commit=2;
他们说的症状基本上是写操作IO过高。跟我碰到的不一样。
一直在优化sql语句上下功夫,该 加的索引都加上了,效果不明显。不断的查资料,最后在一篇文章中受到启发。
在mysql执行查询操作时,有order by排序时或查询都会生成临时表。一般会存在内存里。但是如果内存不足时会存在磁盘上。
翻开宝塔的mysql配置,果然有个tmp_table_size来控制临时表所占内存。
既然这样,调大这个内存值就可以解决这个问题了。
最近又发现,这根mysql的引擎有关,Myisam的话所有的临时表都会存在磁盘上。而innodb的话则会存在内存中。
如果表是Myisam的话,最好改为Innodb .
如何选择:
1. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
2. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。
3. 系统奔溃后,MyISAM恢复起来更困难,能否接受;
4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。