最近用MySQL,使用自增列,在执行批量插入时发现不连续现象。这里并没有删除操作,不是删数据造成的空洞。
后来发现空洞大小和批量大小有些关系,这取决于MySQL生成新的auto_increament_value的方法。
新的自增值会是一个2的n次方的数字。这个数字是大于批量插入数据的最大自增值的2的n次方中最小的那个。
不知道这个行为是不是我特定的MySQL版本造成的,我的版本是5.5.47。
请教大神,是不是有新版本或已经发布的补丁,或者什么设置能改变这个行为,谢了先。我试了如下一些批量大小发现这个规律,请看下表:
一批插入的数据量,为新数据准备的自增值
============= =================
1,2
2,4
3,4
4,8
5,8
6,8
7,8
8,16
9,16
10,16
11,16
12,16
13,16
14,16
15,16
16,32下面脚本给有兴趣的小伙伴参考。用来产生不连续自增值的脚本:
drop table if exists ttt;
drop table if exists tsource;create table if not exists ttt (id int auto_increment primary key, name varchar(50));
create table if not exists tsource (name varchar(50));
insert into tsource values
('aaa'),
('bbb'),
('ccc'),
('ddd');insert into ttt (name)
select name from tsource;insert into ttt (name) values ('eee');select * from ttt;
后来发现空洞大小和批量大小有些关系,这取决于MySQL生成新的auto_increament_value的方法。
新的自增值会是一个2的n次方的数字。这个数字是大于批量插入数据的最大自增值的2的n次方中最小的那个。
不知道这个行为是不是我特定的MySQL版本造成的,我的版本是5.5.47。
请教大神,是不是有新版本或已经发布的补丁,或者什么设置能改变这个行为,谢了先。我试了如下一些批量大小发现这个规律,请看下表:
一批插入的数据量,为新数据准备的自增值
============= =================
1,2
2,4
3,4
4,8
5,8
6,8
7,8
8,16
9,16
10,16
11,16
12,16
13,16
14,16
15,16
16,32下面脚本给有兴趣的小伙伴参考。用来产生不连续自增值的脚本:
drop table if exists ttt;
drop table if exists tsource;create table if not exists ttt (id int auto_increment primary key, name varchar(50));
create table if not exists tsource (name varchar(50));
insert into tsource values
('aaa'),
('bbb'),
('ccc'),
('ddd');insert into ttt (name)
select name from tsource;insert into ttt (name) values ('eee');select * from ttt;
解决方案 »
- mysql 2014错误,求解决办法
- mysql源码安装时遇到的问题,请高手赐教!
- MYSQL计划事件 每天的零点执行一个存储过程
- 急救:怎么查询根据日期查询某一天发布的所有文章?
- 为什么现在的mysql没有mysqld-max-nt.exe文件?
- mysql存储过程中动态构造sql语句
- MySql中插入中文时,出现错误,急~~在线等待
- 兄弟们,帮帮忙! postgres7.3.4 for unix 在哪里可以下载到?
- mysql存储过程
- 数据库中插入总是会提示 incorrect string value,我该怎么做才能插入中文?
- navicat 能不能给mysql的用户针对不同的表设置不同的权限?
- 使用sysbench对mysql进行大数据量随机读写压测时,磁盘读非常高
所以你插入4条语句就分配自增列到8 插入10条语句肯定就分配到16 插入20条语句就分配到32
从来没有往这个表里写数据,那么步长就是1,否则步长就是上次插入数据的条数。
比如,现在的最大id是N1,往表里写入了N2条数据,那么下次写入数据,就是从N1+N2开始。