Chinaunix首页 | 论坛 | 博客
  • 博客访问: 416522
  • 博文数量: 137
  • 博客积分: 5190
  • 博客等级: 大校
  • 技术积分: 997
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-21 16:19
文章存档

2011年(17)

2010年(120)

我的朋友

分类: Mysql/postgreSQL

2010-02-28 18:46:11

2008年11月13日 星期四 下午 08:40
作者:老王

innodb最为大家津津乐道的就是它实现了行锁等高级特性,相比之下,myisam的表锁显得有些弱智。不过很多人都忽视了一点,innodb在MySQL5.0里有时候的行为也是表锁:比如说当表里有一个auto_increment字段的时候,innodb会在内存里保存一个计数器用来记录auto_increment的值,当插入一个新行数据时,就会用一个表锁来锁住这个计数器,直到插入结束。如果一行一行的插入数据则没有什么问题,但是如果大量的并发插入就废了,表锁会引起SQL堵塞,不但影响效率,而且可能会瞬间达到max_connections而崩溃。

在MySQL5.0版本,只要使用了auto_increment字段,那么innodb的表锁问题就无法回避,如果你必须面对大量并发插入的情况,要么听天由命,要么便只能抛弃auto_increment,转而使用自定义主键的方式,但必须小心选择,否则可能会陷入到另一个陷阱当中,比如说,有的人会通过使用UUID主键的方式来回避auto_increment表锁的问题,但是这可能会让应用陷入更严重的IO瓶颈问题之中去,原因可以参考我以前写的文章

还有一个方法就是使用MySQL5.1,在这个版本里,出现了一个新的配置选项:innodb_autoinc_lock_mode,它是专门用来在使用auto_increment的情况下调整锁策略的,目前有三种选择:

innodb_autoinc_lock_mode = 0 (“traditional” lock mode)
innodb_autoinc_lock_mode = 1 (“consecutive” lock mode)
innodb_autoinc_lock_mode = 2 (“interleaved” lock mode)
阅读(1441) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~