Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1938714
  • 博文数量: 219
  • 博客积分: 8963
  • 博客等级: 中将
  • 技术积分: 2125
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-19 12:48
个人简介

文章分类

全部博文(219)

文章存档

2021年(1)

2020年(3)

2015年(4)

2014年(5)

2012年(7)

2011年(37)

2010年(40)

2009年(22)

2008年(17)

2007年(48)

2006年(31)

2005年(4)

分类: Mysql/postgreSQL

2011-04-07 17:26:48

上一节做了简单测试,发现MySQL的innodb引挚慢得不行.

查了mysql的调优文档发现有许多参数可设置,但主要的是这个:innodb_flush_log_at_trx_commit
以下是 Advanced Innodb Optimization.pdf 中对这个参数的描述.

Tune InnoDB log flush behavior on transaction commit
– InnoDB always flushes log to disk about 1/sec in background
– Value 0 - no log flushing on transaction commit
? Use when performance is paramount
? Transaction loss possible when MySQL server crashes
– Value 2 – log is not flushed to the disk, but to OS cache
? Usually just a bit slower compared to value 0
? Transaction loss only when OS/Hardware crashes
? Similar to MyISAM guarantees at some extent
– Value 1 (default) - fully ACID, log flushed to disk on commit
? Use for applications when no transaction loss can be allowed
? Use RAID Battery write back cache for performance
? Make sure OS does proper flush to disk or may be worthless
? With any value tables are not corrupted in case of crash
 
它主要有三个值:
默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。
 
以下是我把这个值设置为0和2时的运行速度

--innodb_flush_log_at_trx_commit=0
insert 1000s data used 3511ms
batch insert 1000s data used 780ms
 
--innodb_flush_log_at_trx_commit=1
insert 1000s data used 48700ms
batch insert 1000s data used 44500ms
 
--innodb_flush_log_at_trx_commit=2
insert 1000s data used 3761ms
batch insert 1000s data used 998ms
 
可以看到设置为2时会比0慢一点点.单条插入每秒都是300条上,批量插入是1000条以上.
我又测试了一下多线程的,是5个相同线程同时运行,每个插1000条.

--innodb_flush_log_at_trx_commit=2
insert 1000s data used 9126ms
insert 1000s data used 9314ms
insert 1000s data used 9923ms
insert 1000s data used 10204ms
insert 1000s data used 10875ms
batch insert 1000s data used 2918ms
batch insert 1000s data used 4090ms
batch insert 1000s data used 4479ms
batch insert 1000s data used 3996ms
batch insert 1000s data used 3341ms

单每的大概是10秒全运行完吧.也就是每秒500条.批量的4秒多运行完,每秒2000+条哇!
当然,这种方式也有有缺点的,如上面所说.但一般还是不会有问题的.
 
我的测试条件只是在我本机vista + mysql5.1.18, MEM:2G, CPU:1.83 * 2. 如果到8核的服务器上,应该还能提高4倍.
阅读(1118) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~