mysql快速生成百万数据

336 阅读1分钟

新建一张表

CREATE TABLE `person` (
  `id` int NOT NULL AUTO_INCREMENT,
  `person_id` int DEFAULT NULL,
  `person_name` varchar(255) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4097 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

插入数据

INSERT INTO `world`.`person`(`id`, `person_id`, `person_name`, `gmt_create`, `gmt_modified`) VALUES (1, 1, 'user_1', '2023-06-06 21:11:42', '2023-06-06 21:11:44');

利用 mysql 伪列 rownum 设置伪列起始点为 1

select (@i:=@i+1) as rownum, person_name  from person, (select @i:=0) as init;

生成百万数据

[运行下面的 sql,连续执行 20 次,就是 2 的 20 次方约等于 100w 的数据;执行 23 次就是 2 的 23 次方约等于 800w , 如此下去即可实现千万测试数据的插入,如果不想翻倍翻倍的增加数据,而是想少量,少量的增加,有个技巧,就是在 SQL 的后面增加 where 条件,如 id > 某一个值去控制增加的数据量即可。]

INSERT INTO person ( id, person_id, person_name, gmt_create, gmt_modified ) SELECT
@i := @i + 1,
LEFT ( rand()* 10, 10 ) AS person_id,
concat( 'user_', @i % 2048 ),
date_add( gmt_create, INTERVAL + @i * cast( rand()* 100 AS signed ) SECOND ),
date_add(
	date_add( gmt_modified, INTERVAL + @i * cast( rand()* 100 AS signed ) SECOND ),
	INTERVAL + cast( rand()* 1000000 AS signed ) SECOND 
) 
FROM
	person;

[此处需要注意的是,也许你在执行到近 800w 或者 1000w 数据的时候,会报错:The total number of locks exceeds the lock table size,这是由于你的临时表内存设置的不够大,只需要扩大一下设置参数即可。]

SET GLOBAL tmp_table_size =512*1024*1024; (512M)

SET global innodb_buffer_pool_size= 1*1024*1024*1024 (1G);