全部博文(321)
分类: 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: