mysql 主键 下一个值_INNODB自增主键的一些问题 vs mysql获得自增字段下一个值
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获得自增字段下一个值相关推荐
- Mysql数据库修改某个字段的值,或修改某个字段的默认值
1.修改数据表的某个数据: update 表名 set 字段名=新值 条件; update users set recordNum=2 where id =2; 2.修改某个字段的默认值 alter ...
- INNODB自增主键的一些问题 vs mysql获得自增字段下一个值
今天发现 批量插入下,自增主键不连续了....... InnoDB AUTO_INCREMENT Lock Modes This section describes the behavior of A ...
- mysql删除没有索引页_InnoDB中没有主键是如何运转的
InnoDB聚簇索引的背景 在InnoDB索引页的物理结构中,"我"讲述了"InnoDB中一切都是索引".这意味着每个InnoDB引擎的表必须有一个" ...
- mybatis mysql usegeneratedkeys_mybatis中useGeneratedKeys用法--插入数据库后获取主键值
前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录 在项目中经常需要获取到插 ...
- mysql复制一个字段值到另一个字段,MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下...
点击查看MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下具体信息 答:update b set tel =(select mobile from a where a.id=b.aid) 注 ...
- 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. ...
- hive导数据到mysql 自增主键出错_python+mysql做一个图书管理系统?
开发一个图书管理系统,首先需要对此项目进行一个简单的需求分析: 主要功能包括: 图书信息 图书分类 用户信息 用户借阅统计 管理员 管理员权限 接下来可以进行数据库的设计,在这里我提供一个简单的数据库 ...
- 重置mysql自增主键值的方法
重置mysql自增主键的值方法 show create table [表名] 查看当前主键索引值alter table [表名] auto_increment = [你希望的值] 设置你希望的索引值 ...
- 为什么 MySQL 的自增主键不单调也不连续
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 转自:真没什么逻辑/Draveness 当我们在使用关系型数据库时 ...
最新文章
- java 的回调函数
- 【数据迁移】使用传输表空间迁移数据
- 构建之法 阅读笔记01
- Caused by: android.os.NetworkOnMainThreadException错误解决办法
- 如何选择Sencha Touch和jQuery Mobile
- 论耐力,哺乳动物中人类可能是第一
- abab的四字成语_带abab的四字成语大全
- 【BZOJ1492】【NOI2007】货币兑换 Cash(CDQ分治,斜率优化)
- 火车票电子客票系统已全面上线,如何识别多种身份有效证件?
- python扫雷游戏代码_基于Python实现的扫雷游戏实例代码
- 利用Udacity模拟器实现自己的自动驾驶小车
- linux安装 web2py,在Linux上使用web2py_uwsgi_nginx搭建web服务器
- adb工具的安装方法
- 初识AMD型号CPU
- greenplum麒麟安装笔记
- 绝对定位元素的margin如何设置
- 安卓的短信记录导入苹果_如何将安卓手机短信导入到iphone(未越狱)
- 华为云云耀云服务器 中小企业的福音
- 怎么用python画世界地图_用Python画世界地图
- 【亲测有效】mac电脑也能玩魔兽世界怀旧版(wow经典怀旧版)
热门文章
- maven使用OracleDB jdbc Driver
- ubuntu16安装go语言
- Centos: 解决系统编码 locale 的报错 LC_CTYPE / LC_ALL 问题
- 大数据架构如何做到流批一体?【对于Flink等流批一体的概念做了很好的澄清!】
- 大剑无锋之内存泄漏是什么?【面试推荐】
- Zookeeper全解析——Paxos作为灵魂
- 操作系统:第四章 文件管理2 - 磁盘管理,磁盘调度算法
- 多线程与高并发(九):单机压测工具JMH,单机最快MQ - Disruptor原理解析
- 【Java网络编程(一)】IP地址、端口、URL、网络爬虫原理、TCP UDP协议
- zookeeper简介以及C客户端用法