表结构如下:
SQL code
[code="java"]
mysql> show create table tb_user \G
*************************** 1. row ***************************
Table: tb_user
Create Table: CREATE TABLE tb_user
(pk_user
int(10) NOT NULL AUTO_INCREMENT COMMENT 'PK主键',true_name
varchar(20) DEFAULT NULL COMMENT '用户姓名,必填',country
varchar(4) DEFAULT NULL
,province
varchar(4) DEFAULT NULL,city
varchar(4) DEFAULT NULL,company_name
varchar(30) DEFAULT NULL ,department
varchar(20) DEFAULT NULL ,position
varchar(4) DEFAULT NULL ,address
varchar(100) DEFAULT NULL ,phone
varchar(20) DEFAULT NULL ,company_property
varchar(4) DEFAULT NULL ,company_product
varchar(4) DEFAULT NULL ,company_person_count
varchar(4) DEFAULT NULL ,info_mode
varchar(4) DEFAULT NULL ,register_date
datetime DEFAULT NULL ,active_state
varchar(4) DEFAULT NULL ,lock_state
varchar(4) DEFAULT NULL ,use_state
varchar(4) DEFAULT NULL ,creater
varchar(20) DEFAULT NULL ,create_date
datetime DEFAULT NULL ,updater
varchar(20) DEFAULT NULL ,update_date
datetime DEFAULT NULL ,
PRIMARY KEY (pk_user
)
) ENGINE=InnoDB AUTO_INCREMENT=2424797 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
[/code]
这里我只是想在表中快速插入千万条数据,因此首先我手动插入2条数据:
SQL code
insert into tb_user (true_name) values ('jack'); insert into tb_user (true_name) values ('tom');
然后使用下列语句实现快速插入:
SQL code
insert into tb_user (true_name)(select true_name from tb_user);
但是问题来了,在查询前20条数据就发现pk_user不是按照顺序递增的,中间有很多间隙,前20条数据少了5、10、11、12、21-27, 20条数据直接把pk_user分配到了31.。
另外,这是在本机单机无并发情况下无事务,纯语句级别使用JAVA循环插入实现的
[code="java"]
mysql> show variables like 'innodb_autoinc_lock_mode';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_autoinc_lock_mode | 1 |
+--------------------------+-------+
1 row in set (0.00 sec)
[/code]
请教大虾分析下是什么原因产生的,如何解决?拜谢!