MySQL中自增长与锁
2016-02-01 14:27
639 查看
在InnoDB存储引擎中,对于每个含有自增长值的表都有一个自增长计数器(auto-increment counter)当对含有自增长的计数器的表进行插入操作时,这个计数器会被初始化,执行如下的语句可以得到计数器的值
>SELECT MAX(auto_inc_col) FROM t FOR UPDATE;
插入操作会根据这个自增长的计数器值加1赋予自增长列。这个实现方式称为AUTO-INC Locking.这种锁其实是采用一种特殊的表锁机制,为了提高插入的性能,锁不是在每一个事务完成后才释放,而是在完成对自增长插入的SQL语句后立即释放
虽然AUTO-INC Locking从一定程度上提高了并发插入的效率,但是还是存在性能上的问题。首先对于有自增长值的列的并发插入性能较差,事务必须等待前一个插入的完成(虽然不用等待事务的完成)。其次对于INSERT ....SELECT的大数据量的插入会影响插入的性能,因为另一个事务的插入会被阻塞
从MySQL 5.1.22版本开始,InnoDB提供了一种轻量级互斥量的自增长实现机制,这种机制大大提高了自增长插入的性能。并且从这个版本开始,InnoDB提供了一个参数innodb_autoinc_lock_mode来控制自增长的模式,该参数的默认值为1,在继续讨论新的自增长实现方式之前,需要对自增长的插入进行分类
接着分析参数innodb_autoinc_lock_mode以及各个设置下对自增的影响,其共有3个有效值可以设定 0 1 2
这里需要特别注意,InnoDB跟MyISAM不同,MyISAM存储引擎是表锁设计,自增长不用考虑并发插入的问题。因此在master上用InnoDB存储引擎,在slave上用MyISAM存储引擎的replication架构下,用户可以考虑这种情况
另外,InnoDB存储引擎,自增持列必须是索引,同时必须是索引的第一个列,如果不是第一个列,会抛出异常,而MyiSAM不会有这个问题
>SELECT MAX(auto_inc_col) FROM t FOR UPDATE;
插入操作会根据这个自增长的计数器值加1赋予自增长列。这个实现方式称为AUTO-INC Locking.这种锁其实是采用一种特殊的表锁机制,为了提高插入的性能,锁不是在每一个事务完成后才释放,而是在完成对自增长插入的SQL语句后立即释放
虽然AUTO-INC Locking从一定程度上提高了并发插入的效率,但是还是存在性能上的问题。首先对于有自增长值的列的并发插入性能较差,事务必须等待前一个插入的完成(虽然不用等待事务的完成)。其次对于INSERT ....SELECT的大数据量的插入会影响插入的性能,因为另一个事务的插入会被阻塞
从MySQL 5.1.22版本开始,InnoDB提供了一种轻量级互斥量的自增长实现机制,这种机制大大提高了自增长插入的性能。并且从这个版本开始,InnoDB提供了一个参数innodb_autoinc_lock_mode来控制自增长的模式,该参数的默认值为1,在继续讨论新的自增长实现方式之前,需要对自增长的插入进行分类
接着分析参数innodb_autoinc_lock_mode以及各个设置下对自增的影响,其共有3个有效值可以设定 0 1 2
这里需要特别注意,InnoDB跟MyISAM不同,MyISAM存储引擎是表锁设计,自增长不用考虑并发插入的问题。因此在master上用InnoDB存储引擎,在slave上用MyISAM存储引擎的replication架构下,用户可以考虑这种情况
另外,InnoDB存储引擎,自增持列必须是索引,同时必须是索引的第一个列,如果不是第一个列,会抛出异常,而MyiSAM不会有这个问题
相关文章推荐
- Mysql中count(*),DISTINCT的使用方法和效率研究
- MYSQLI - mysqli操作数据库
- 阿里开源Mysql分布式中间件:Cobar
- 用(*.frm *.MYD *.MYI)文件恢复MySql数据库
- MySQL中distinct及group by的一些用法 分享
- mysql主从同步配置
- MySql数据库基本介绍和基本语法
- MYSQL设计优化
- 设置mysql允许外部IP访问
- MySQL的事务隔离级别
- 基于MYCAT的MYSQL主从与读写分离配置
- SELECT INTO FROM mysql Undeclared variable
- `block in replace_gem': Please install the mysql2 adapter: `gem install activerecord-mysql2-adapter`
- MySQL中一致性非锁定读
- MYSQL 修改表结构基本操作一览
- mysql中聚合函数条件
- 通过Navicat for MySQL远程连接的时候报错mysql 1130 的解决方法
- MyBatis+MySQL 返回参数
- mysql建立不上外键,sql语句一运行完就会生成一条索引,但是外键却建不上
- MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用