对比myisam和innodb的性能差异,批量插入的效果。
sync_binlog=0
innodb_flush_method=O_DIRECT
innodb_flush_log_at_trx_commit=2
单次插入总数:10w条
注:ip varchar(255)来源于业务,这里暂不做修改。
CREATE TABLE `wm_buz_consume_time_log` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT ‘主键’,
`wm_poi_id` int(11) NOT NULL COMMENT,
`app_type` tinyint(2) DEFAULT ’0′ ,
`url` varchar(1024) DEFAULT NULL COMMENT ‘访问url’,
`consume_time` int(11) DEFAULT ’0′ COMMENT ‘响应时间’,
`ip` varchar(255) DEFAULT NULL,
`ctime` int(11) DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (`id`)
)
innodb | myisam | |
---|---|---|
单线程 | 3688 | 4600 |
4线程 | 3400 | 4600 |
16线程 | 3200 | 4600 |
engine | record/insert | insert/second | record/second |
---|---|---|---|
MyISAM | 10 | 3554.22762529 | 35542.3 |
50 | 1982.53113005 | 99126.6 | |
100 | 1117.44688596 | 111745 | |
200 | 599.321012222 | 119864 | |
300 | 399.327219915 | 119798 | |
400 | 298.744724058 | 119498 | |
500 | 246.173864279 | 123087 | |
Inoodb | 10 | 1987.27785192 | 19872.8 |
50 | 790.588036815 | 39529.4 | |
100 | 510.040947166 | 51004.1 | |
200 | 324.766895247 | 64953.4 | |
300 | 203.101339928 | 60930.4 | |
400 | 174.502397867 | 69801 | |
500 | 142.428435136 | 71214.2 |
MyISAM因为表级锁,不受到线程数的影响;MyISAM显著的比INNODB快(INNODB存在锁、事务的开销),单线程高27%,随着线程数的增大,优势会更加明显。
MyISAM批量插入性能改善的十分明显,在单次批量到达100之后,插入速度基本上稳定下来,可以达到10w record/s,是单条插入的24倍。
Innodb批量插入性能改善的十分明显,并且随着批量次数的不断增大,性能再持续增加,批量100,可以打到5w record/s,是单条插入的14倍,但是只有MyISAM的50%。
MyISAM虽然插入性能比INNODB快很多,但是依旧建议采用INNODB+批量写入的方式,因为MyISAM存在表crash的问题(表很大的时候,索引较多的时候,recovery需要很长时间,并且recovery的过程中不可读写);另外不建议批量太多,存在超出max_allowed_packet的风险,会导致数据库在很多环节不太平滑。