root@localhost : test 04:23:28>show variables like ‘innodb_autoinc_lock_mode‘;

+--------------------------+-------+

| Variable_name | Value |

+--------------------------+-------+

| innodb_autoinc_lock_mode | 1 |

+--------------------------+-------+

1 row in set (0.00 sec)

root@localhost : test 04:23:31>create table tmp_auto_inc(id int auto_increment primary key,talkid int)engine = innodb default charset gbk;

Query OK, 0 rows affected (0.16 sec)

root@localhost : test 04:23:35>insert into tmp_auto_inc(talkid) select talkId from talk_dialog limit 10;

Query OK, 10 rows affected (0.00 sec)

Records: 10 Duplicates: 0 Warnings: 0

root@localhost : test 04:23:39>show create table tmp_auto_inc\G;

*************************** 1. row ***************************

Table: tmp_auto_inc

Create Table: CREATE TABLE `tmp_auto_inc` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`talkid` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=gbk

1 row in set (0.00 sec)

插入10条记录,但表的AUTO_INCREMENT=16,再插入一条的时候,表的自增id已经是不连续了。

原因:

参数innodb_autoinc_lock_mode = 1时,每次会“预申请”多余的id(handler.cc:compute_next_insert_id),而insert执行完成后,会特别将这些预留的id空出,就是特意将预申请后的当前最大id回写到表中(dict0dict.c:dict_table_autoinc_update_if_greater)。

这个预留的策略是“不够时多申请几个”, 实际执行中是分步申请。至于申请几个,是由当时“已经插入了几条数据N”决定的。当auto_increment_offset=1时,预申请的个数是 N-1。

所以会发现:插入只有1行时,你看不到这个现象,并不预申请。而当有N>1行时,则需要。多申请的数目为N-1,因此执行后的自增值为:1+N+(N-1)。测试中为10行,则:1+10+9 =20,和 16不一致?原因是:当插入8行的时候,表的AUTO_INCREMENT已经是16了,所以插入10行时,id已经在第8行时预留了,所以直接使用,自增值仍为16。所以当插入8行的时候,多申请了7个id,即:9,10,11,12,13,14,15。按照例子中的方法插入8~15行,表的AUTO_INCREMENT始终是16

验证:

插入16行:猜测 预申请的id:1+16+(16-1)= 32,即:AUTO_INCREMENT=32

root@localhost : test 04:55:45>create table tmp_auto_inc(id int auto_increment primary key,talkid int)engine = innodb default charset gbk;

Query OK, 0 rows affected (0.17 sec)

root@localhost : test 04:55:48>insert into tmp_auto_inc(talkid) select talkId from sns_talk_dialog limit 16;

Query OK, 16 rows affected (0.00 sec)

Records: 16 Duplicates: 0 Warnings: 0

root@localhost : test 04:55:50>show create table tmp_auto_inc\G;

*************************** 1. row ***************************

Table: tmp_auto_inc

Create Table: CREATE TABLE `tmp_auto_inc` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`talkid` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=gbk

1 row in set (0.00 sec)

和猜测的一样,自增id到了32。所以当插入16行的时候,多申请了17,18,19...,31 。

所以导致ID不连续的原因是因为innodb_autoinc_lock_mode = 1时,会多申请id。好处是:一次性分配足够的auto_increment id,只会将整个分配的过程锁住。

5.1.22前 默认:innodb_autoinc_lock_mode = 0

root@localhost : test 04:25:12>show variables like ‘innodb_autoinc_lock_mode‘;

+--------------------------+-------+

| Variable_name | Value |

+--------------------------+-------+

| innodb_autoinc_lock_mode | 0 |

+--------------------------+-------+

1 row in set (0.00 sec)

root@localhost : test 04:25:15>create table tmp_auto_inc(id int auto_increment primary key,talkid int)engine = innodb default charset gbk;

Query OK, 0 rows affected (0.17 sec)

root@localhost : test 04:25:17>insert into tmp_auto_inc(talkid) select talkId from talk_dialog limit 10;

Query OK, 10 rows affected (0.00 sec)

Records: 10 Duplicates: 0 Warnings: 0

root@localhost : test 04:25:21>show create table tmp_auto_inc\G;

*************************** 1. row ***************************

Table: tmp_auto_inc

Create Table: CREATE TABLE `tmp_auto_inc` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`talkid` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=gbk

1 row in set (0.00 sec)

INNODB自增主键的一些问题 vs mysql获得自增字段下一个值

标签:mysql   int   configure   sel   limit   section   not   互斥量   好处

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://www.cnblogs.com/micro-chen/p/6942151.html

mysql 主键 下一个值_INNODB自增主键的一些问题 vs mysql获得自增字段下一个值相关推荐

  1. Mysql数据库修改某个字段的值,或修改某个字段的默认值

    1.修改数据表的某个数据: update 表名 set 字段名=新值 条件; update users set recordNum=2 where id =2; 2.修改某个字段的默认值 alter ...

  2. INNODB自增主键的一些问题 vs mysql获得自增字段下一个值

    今天发现 批量插入下,自增主键不连续了....... InnoDB AUTO_INCREMENT Lock Modes This section describes the behavior of A ...

  3. mysql删除没有索引页_InnoDB中没有主键是如何运转的

    InnoDB聚簇索引的背景 在InnoDB索引页的物理结构中,"我"讲述了"InnoDB中一切都是索引".这意味着每个InnoDB引擎的表必须有一个" ...

  4. mybatis mysql usegeneratedkeys_mybatis中useGeneratedKeys用法--插入数据库后获取主键值

    前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录 在项目中经常需要获取到插 ...

  5. mysql复制一个字段值到另一个字段,MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下...

    点击查看MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下具体信息 答:update b set tel =(select mobile from a where a.id=b.aid) 注 ...

  6. 2019-7-26 [MySQL] 安装与介绍 语句分类/语法 数据类型 DDL数据定义:创建/查看/删除/使用 DML数据操作:增删改 主键约束 自动增长列 非空约束 默认值 Navicat

    文章目录 0.知识回顾 1.数据库介绍 1.1 数据库概述 1.1.1 什么是数据库 1.1.2 什么是数据库管理系统 1.1.3 数据库与数据库管理系统的关系 1.2 数据库表 1.3 表数据 1. ...

  7. hive导数据到mysql 自增主键出错_python+mysql做一个图书管理系统?

    开发一个图书管理系统,首先需要对此项目进行一个简单的需求分析: 主要功能包括: 图书信息 图书分类 用户信息 用户借阅统计 管理员 管理员权限 接下来可以进行数据库的设计,在这里我提供一个简单的数据库 ...

  8. 重置mysql自增主键值的方法

    重置mysql自增主键的值方法 show create table [表名] 查看当前主键索引值alter table [表名] auto_increment = [你希望的值] 设置你希望的索引值 ...

  9. 为什么 MySQL 的自增主键不单调也不连续

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 转自:真没什么逻辑/Draveness 当我们在使用关系型数据库时 ...

最新文章

  1. java 的回调函数
  2. 【数据迁移】使用传输表空间迁移数据
  3. 构建之法 阅读笔记01
  4. Caused by: android.os.NetworkOnMainThreadException错误解决办法
  5. 如何选择Sencha Touch和jQuery Mobile
  6. 论耐力,哺乳动物中人类可能是第一
  7. abab的四字成语_带abab的四字成语大全
  8. 【BZOJ1492】【NOI2007】货币兑换 Cash(CDQ分治,斜率优化)
  9. 火车票电子客票系统已全面上线,如何识别多种身份有效证件?
  10. python扫雷游戏代码_基于Python实现的扫雷游戏实例代码
  11. 利用Udacity模拟器实现自己的自动驾驶小车
  12. linux安装 web2py,在Linux上使用web2py_uwsgi_nginx搭建web服务器
  13. adb工具的安装方法
  14. 初识AMD型号CPU
  15. greenplum麒麟安装笔记
  16. 绝对定位元素的margin如何设置
  17. 安卓的短信记录导入苹果_如何将安卓手机短信导入到iphone(未越狱)
  18. 华为云云耀云服务器 中小企业的福音
  19. 怎么用python画世界地图_用Python画世界地图
  20. 【亲测有效】mac电脑也能玩魔兽世界怀旧版(wow经典怀旧版)

热门文章

  1. maven使用OracleDB jdbc Driver
  2. ubuntu16安装go语言
  3. Centos: 解决系统编码 locale 的报错 LC_CTYPE / LC_ALL 问题
  4. 大数据架构如何做到流批一体?【对于Flink等流批一体的概念做了很好的澄清!】
  5. 大剑无锋之内存泄漏是什么?【面试推荐】
  6. Zookeeper全解析——Paxos作为灵魂
  7. 操作系统:第四章 文件管理2 - 磁盘管理,磁盘调度算法
  8. 多线程与高并发(九):单机压测工具JMH,单机最快MQ - Disruptor原理解析
  9. 【Java网络编程(一)】IP地址、端口、URL、网络爬虫原理、TCP UDP协议
  10. zookeeper简介以及C客户端用法