测试目的

对比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`)
)

单条INSERT

单线程36884600
4线程34004600
16线程32004600

批量Insert

enginerecord/insertinsert/secondrecord/second
MyISAM103554.2276252935542.3
501982.5311300599126.6
1001117.44688596111745
200599.321012222119864
300399.327219915119798
400298.744724058119498
500246.173864279123087
Inoodb101987.2778519219872.8
50790.58803681539529.4
100510.04094716651004.1
200324.76689524764953.4
300203.10133992860930.4
400174.50239786769801
500142.42843513671214.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的风险,会导致数据库在很多环节不太平滑。

09-19 02:23