论坛首页 综合技术论坛

Mysql InnoDB表锁问题

浏览 4181 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-02-23   最后修改:2009-02-23

  在讨论问题之前,先看下面的mysql信息

mysql> show status like "%table_lock%";      
+-----------------------+---------+
| Variable_name         | Value   |
+-----------------------+---------+
| Table_locks_immediate | 1290950 | 
| Table_locks_waited    | 1069    | 
+-----------------------+---------+
2 rows in set (0.01 sec)

 

  mysql版本5.0.77, 使用的存储引擎是innodb,而该引擎最主要的特点是transactional和row lock。按理说不会出现表锁才对,但是事实是出现了,并且锁的争用很严重。

 

  查看mysql文档会发现,虽然innodb使用的的row lock,但是在处理具有auto increment字段的表的时候,会使用一种特殊的表锁——AUTO-INC。简单来说就是innodb会在内存里保存一个计数器用来记录auto_increment的值,当插入数据时,就会用一个表锁来锁住这个计数器,直到插入结束。一条一条插入问题不大,但是如果高并发插入,就会造成sql阻塞。

 

  目前已知的解决方法有两种:

  1. 不用auto increment字段,自己维护主键生成。该方法中选择主键生成策略很重要, 要综合考虑简单和效率问题。假设使用uuid,虽然简单但是会造成该表的主键效率很低(innodb的主键是特殊的index,其他的index会引用主键,详见mysql文档)。
  2. 升级到最新的5.1版本。mysql在5.1.22版本以后提供了不同方式的auto-inc配置
innodb_autoinc_lock_mode = 0  (“traditional” lock mode) 

innodb_autoinc_lock_mode = 1  (“consecutive” lock mode) 

innodb_autoinc_lock_mode = 2  (“interleaved” lock mode)

 

  可以参考文档http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html

  PS:使用复制功能时请详细阅读文档

 

   发表时间:2009-03-06  
不错, 不过, 你要这么高的写入性能? innodb合适么
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics