关于Mysql表InnoDB下插入速度慢的解决方案

栏目:Linux, PHP技术 作者:小天 点击: 2,962 次

最近作了 server_log 日志数据库记录,仅仅插入,由平台来获取数据进行分析的需求。php

可是内部反馈插入数据库记录很是耗时,我就很纳闷了,一个insert怎么会 30-50ms 呢?按说应该在 0.5ms 之内的;数据库

通过分析,发现是InnoDB数据库的Row_Format格式问题,改成MyISAM表就能够了,可是InnoDB是支持事务的,通常是推荐InnoDB的,好奇为何。

并且InnoDB的表,只能选择 COMPACT 和REDUNDANT 两种行格式(RoW_FORMAT)。测试

通过搜索得到:操作系统

innodb_flush_log_at_trx_commit

该参数控制重作日志写入磁盘的过程。咱们知道 InnoDB 使用“Write Ahead Log”策略来避免数据丢失问题,即依靠重作日志来保证数据能在丢失后进行恢复。所以,InnoDB 重作日志的持久化很是重要。

该参数的有效值有 0、1、2:

0:事务提交时,不将重作日志缓冲写入磁盘,而是依靠 InnoDB 的主线程每秒执行一次刷新到磁盘。所以若是 MySQL 发生宕机,那么就有可能丢失一部分事务。

1:事务提交时,会将重作日志缓冲写入磁盘,而且当即刷新(fsync())。注意,由于操做系统的“延迟写”特性,此时的刷入只是写到了操做系统的缓冲区中,所以执行同步操做才能保证必定持久化到了硬盘中。

2:事务提交时,会将重作日志缓冲写入磁盘,可是不会当即进行刷新操做,所以只是写到了操做系统的缓冲区。此时若操做系统发生宕机而没有即便的同步,也可能会丢失一部分数据。

能够看到,只有1才能真正地保证事务的持久性,可是因为刷新操做 fsync() 是阻塞的,直到完成后才返回,咱们知道写磁盘的速度是很慢的,所以 MySQL 的性能会明显地降低。若是不在意事务丢失,,0和2能得到更高的性能。

通过测试,修改值为0或者2 后,插入速度果真提高了,1.4秒能够插入2W条记录,平均<1ms知足需求。



声明: 本文由( 小天 )原创编译,转载请保留链接: 关于Mysql表InnoDB下插入速度慢的解决方案

------====== 本站公告 ======------
欢迎使用趣域网域名百科,我们将长期提供域名使用相关知识和投资域名的方法和技巧;并提供主机、服务器的解决问题和网站运营方法。