Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1063123
  • 博文数量: 321
  • 博客积分: 7872
  • 博客等级: 少将
  • 技术积分: 2120
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-16 09:06
文章分类

全部博文(321)

文章存档

2017年(1)

2016年(1)

2015年(12)

2014年(17)

2013年(78)

2012年(15)

2011年(17)

2010年(67)

2009年(102)

2008年(11)

分类: LINUX

2009-08-04 15:51:28

InnoDB引擎对于巨量数据有强大的优势。特别是ROW LOCK的设计,即使多线程同时修改表中的多处数据,也不会造成锁死和等待。好处我就不多说了。

但是如果在InnoDB中大量使用 INSERT…SELECT这种批量插入的语句,InnoDB的优势便很遗憾的无法发挥了。为什么?因为MySQL为了保证Log和 Replication阵列的正常工作,就必须按顺序记录下所有数据插入记录,以保证当数据库阵列中的其他数据库通过Log建立数据库镜像的正确性。其前 提就是记录中的数据必须是确定的数值,而不能是不确定的数据。INSERT…SELECT中的SELECT过程耗时不固定,所以为了保证Log中的数据顺 序不被打乱,MySQL在这种情况必须要Lock整个表,等待SELECT结果并插入后,才会对表解锁。由此也带来剧大的效率损失。

这种锁死机制因为是由Log系统结构决定的,所以很难规避。但是如果并不准备建立阵列或Log,那么就可以在my.cnf中禁用Log后,使用 innodb_locks_unsafe_for_binlog=1参数。该参数可以解除MySQL为等待INSERT…SELECT结果而锁死目标表的 机制,使InnoDB表格成为真正不会锁死的表。

from:

阅读(1444) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~