百万级数据库样例的简单实现

/ 数据库

构建测试数据,一般可以写py脚本,也可以在应用项目中使用连接池构建测试数据。

但是我感觉以上的方法可能很高效,但不一定方便。需要配置连接,编写调用逻辑等。

如果你不在乎速度,只求便捷,那么我建议可以采用sql自带的存储过程来完成。

1.新建表测试表sys_user

CREATE TABLE `sys_user` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `username` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名',
  `password` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码',
  `salt` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '盐',
  `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2769446 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户测试表'

2.开启存储函数信任

set global log_bin_trust_function_creators=1;

3.执行随机字符函数

delimiter $$
CREATE FUNCTION rand_string(n int) RETURNS varchar(255)
begin
  declare chars_str varchar(100)
  default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  declare return_str varchar(255) default "";
  declare i int default 0;
  while i < n do
      set return_str=concat(return_str,substring(chars_str,floor(1+rand()*62),1));
      set i= i+1;
  end while;
  return return_str;
end $$
delimiter ;

4.执行插入函数

delimiter $$
CREATE  PROCEDURE `insert_data`(IN n int)
BEGIN
  DECLARE i INT DEFAULT 1;
    WHILE (i <= n ) DO
      INSERT into sys_user (username,password,salt ) VALUEs (rand_string(8),rand_string(16),rand_string(16) );
            set i=i+1;
    END WHILE;
END $$
delimiter ;

5.调用运行,插入100w测试数据

call insert_data(1000000);

最后,喝杯咖啡,稍等片刻,百万数据就造好了。实测大概需要8分钟左右。