mysql InnoDB与MyISAM引擎插入性能测试

作者:zarte    发布时间: 2021-02-07

mysqlinnodbmyisam

5.7版本
无任何索引
测试数据

INSERT INTO `jumpchk_log` (`id`,`gameid`,`serverid`,`pk_serverid`,`userid`,`username`,`map`,`inter`,`timestamp`,`logtime`,`addtime`) VALUES (  0, 1, 2, 0, 11111, 'Blusdsuesy', '102', 21, '20201220', '2020-12-20 01:40:25', '2021-01-19 13:58:36')
700条数据结果:
MyISAM:0s
InnoDB:23~27s

调整innodb_flush_log_at_trx_commit参数
0/2:0~1s
1:23~27s

参数说明:
0:提交事务的时候,不立即把 redo log buffer 里的数据刷入磁盘文件的,而是依靠 InnoDB 的主线程每秒执行一次刷新到磁盘。此时可能你提交事务了,结果 mysql 宕机了,然后此时内存里的数据全部丢失。
1.提交事务的时候,就必须把 redo log 从内存刷入到磁盘文件里去,只要事务提交成功,那么 redo log 就必然在磁盘里了。注意,因为操作系统的“延迟写”特性,此时的刷入只是写到了操作系统的缓冲区中,因此执行同步操作才能保证一定持久化到了硬盘中。
2:提交事务的时候,把 redo 日志写入磁盘文件对应的 os cache 缓存里去,而不是直接进入磁盘文件,可能 1 秒后才会把 os cache 里的数据写入到磁盘文件里去。

只有1才能真正地保证事务的持久性,但是由于刷新操作 fsync() 是阻塞的,直到完成后才返回,我们知道写磁盘的速度是很慢的,因此 MySQL 的性能会明显地下降。如果不在乎事务丢失,0和2能获得更高的性能。
刷写概念
刷写其实是两个操作,刷(flush)和写(write),区分这两个概念(两个系统调用)是很重要的。在大多数的操作系统中,把Innodb的log buffer(内存)写入日志(调用系统调用write),只是简单的把数据移到操作系统缓存中,操作系统缓存同样指的是内存。并没有实际的持久化数据。

上一篇:  smtp协议附php示例

下一篇:  golang使用grpc开发

加载更多