`

Mysql InnoDB表锁问题

阅读更多

  在讨论问题之前,先看下面的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:使用复制功能时请详细阅读文档

 

分享到:
评论
1 楼 sdh5724 2009-03-06  
不错, 不过, 你要这么高的写入性能? innodb合适么

相关推荐

    MySQL Innodb 索引原理详解

    ### MySQL Innodb 索引原理详解 #### 1. 各种树形结构 在深入探讨MySQL Innodb索引之前,我们先了解几种基本的树形数据结构,包括二叉搜索树、B树、B+树以及B*树。 ##### 1.1 搜索二叉树(Binary Search Tree) ...

    Mysql Innodb死锁情况分析与归纳.docx

    ### MySQL Innodb 死锁情况分析与归纳 #### 案例背景介绍 在实际数据库运维过程中,我们可能会遇到各种各样的问题,其中死锁是一个较为常见也较为棘手的问题之一。本文将以一个具体的案例为基础,对MySQL Innodb...

    Mysql InnoDB引擎的索引与存储结构详解

    MyISAM存储引擎是MySQL的默认存储引擎,适用于非事务处理的应用,支持全文索引和表锁。而InnoDB是为事务处理设计的,它提供了行级锁定和外键约束。Memory存储引擎使用内存来存储数据,适合于需要快速读写的应用场景...

    mysql 锁表锁行语句分享(MySQL事务处理)

    在标题和描述中提到的“mysql 锁表锁行语句分享”是关于如何在MySQL中使用事务来锁定特定行数据,确保在操作期间不会被其他并发事务访问。 在给出的代码示例中,首先通过`set autocommit=0`关闭了自动提交模式,这...

    MySQL 行锁和表锁的含义及区别详解

    在MySQL中,不同的存储引擎支持不同的锁机制,其中InnoDB引擎是默认引擎,支持行锁和表锁,而MyISAM引擎只支持表锁。 1. **行锁(Row Locks)** 行锁是在数据行级别上施加的锁,提供了最高的并发性能。在InnoDB...

    2021年MySQL高级教程视频.rar

    20.MySQL高级锁InnoDB行锁行锁升级为表锁.avi 21.MySQL高级锁InnoDB行锁间隙锁危害.avi 22.MySQL高级锁InnoDB行锁争用情况查看.avi 23.MySQL高级锁InnoDB行锁总结.avi 24.MySQL高级SQL技巧SQL执行顺序及正则表达式....

    MyISAM引擎与InnoDB引擎性能的对比

    MySQL数据库系统提供了多种存储引擎,其中最常用的两种是MyISAM和InnoDB。它们各自具有独特的特性和适用场景,理解二者的性能差异对于优化数据库设计至关重要。 MyISAM引擎是MySQL早期的默认存储引擎,以其高速度和...

    Mysql开发的ISAM表锁.zip

    总结来说,ISAM表锁是MySQL早期的一种锁定机制,适合于低并发、不需要事务处理的简单应用场景。随着技术的发展,InnoDB存储引擎已经成为大多数情况下的首选,因为它提供了更高的并发性能和数据安全性。了解ISAM表锁...

    Innodb存储引擎浅析—事务系统

    在MySQL的众多存储引擎中,InnoDB无疑是最为重要且被广泛使用的之一。本文旨在深入解析InnoDB存储引擎中的事务处理机制及其背后的设计原理。 #### 存储引擎介绍 在MySQL中,存储引擎负责管理数据的存储和检索。...

    MySQL技术内幕 SQL编程及优化.pdf

    1.基础篇 1.1 explain执行计划 1.2 sq|编程 1.3数据类型 1.4查询处理 1.5子查询 ...2.2 索引问题. ...4.2InnoDB锁问题 5.优化MySQL Server 5.1MySQL体系结构概览内存管理及优化 5.2InnoDB log机制及优化

    MySQL Innodb表导致死锁日志情况分析与归纳

    在数据库管理领域,特别是针对MySQL的InnoDB存储引擎,了解并解决死锁问题是至关重要的。本文将详细探讨一个具体案例:当备份表格的SQL语句与删除该表部分数据的SQL语句同时运行时,MySQL如何检测到死锁并打印出相应...

    MySQL存储引擎之争-InnoDB与MyISAM全面对决

    综合来看,尽管InnoDB在事务和并发控制方面表现更优,已成为MySQL的默认存储引擎,但MyISAM在读密集型应用和空间敏感应用中仍有一定的优势。在选择存储引擎时,应根据实际应用的需求,如事务处理的重要性、并发用户...

    MySQL的InnoDB中的各种锁是怎么工作的

    MySQL的InnoDB存储引擎在处理并发事务时,采用了多种锁机制来确保数据的一致性和并发性能。这些锁主要分为行级锁和表级锁。行级锁是InnoDB的默认锁策略,它允许更高的并发性,因为它只锁定操作的具体行,而不是整个...

    mysql数据据存储引擎InnoDB和MyISAM的优势及区别分享.pdf

    3. 锁定机制:InnoDB 使用行锁(locking on row level),而 MyISAM 使用表锁(table lock)。 4. 性能:InnoDB 的性能比 MyISAM 高,特别是在高并发场景下。 5. 数据存储:InnoDB 将数据和索引存放在表空间里,可能...

    8.MySQL存储引擎--MyISAM与InnoDB区别1

    在InnoDB中,使用行锁可以提高并发性能,而MyISAM则使用表锁,可能会降低并发性能。 SQL语句 InnoDB和MyISAM在SQL语句方面也有所不同。在InnoDB中,使用UPDATE table SET num=1 WHERE name LIKE “%aaa%”可以快速...

Global site tag (gtag.js) - Google Analytics