MySQL生成千万测试数据以及遇到的问题

吾爱主题 阅读:191 2024-04-01 23:20:43 评论:0
目录
  • 1、创建基础表结构
  • 2、创建内存表
  • 3、创建存储过程和函数
  • 4、执行存储过程
  • 5、遇到的问题
    • 5.1、1449错误
    • 5.2、1114错误
  • 6、同步数据
  • 总结

1、创建基础表结构

?
1 2 3 4 5 6 7 8 9 10 CREATE TABLE `t_user` (   `id` int (11) NOT NULL AUTO_INCREMENT,   `c_user_id` varchar (36) NOT NULL DEFAULT '' ,   `c_name` varchar (22) NOT NULL DEFAULT '' ,   `c_province_id` int (11) NOT NULL ,   `c_city_id` int (11) NOT NULL ,   `create_time` datetime NOT NULL ,   PRIMARY KEY (`id`),   KEY `idx_user_id` (`c_user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2、创建内存表

直接往实表添加数据比较慢,所以我们先插入内存表,然后再同步到实表。

?
1 2 3 4 5 6 7 8 9 10 CREATE TABLE `t_user_memory` (   `id` int (11) NOT NULL AUTO_INCREMENT,   `c_user_id` varchar (36) NOT NULL DEFAULT '' ,   `c_name` varchar (22) NOT NULL DEFAULT '' ,   `c_province_id` int (11) NOT NULL ,   `c_city_id` int (11) NOT NULL ,   `create_time` datetime NOT NULL ,   PRIMARY KEY (`id`),   KEY `idx_user_id` (`c_user_id`) ) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4;

3、创建存储过程和函数

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 # 创建随机字符串 delimiter $$ CREATE DEFINER = `root` @`%` FUNCTION `randStr` ( n INT ) RETURNS VARCHAR ( 255 ) CHARSET utf8mb4 DETERMINISTIC 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 $$ # 创建随机时间的函数,sd和ed两个入参代表生成的时间是这个时间范围内的。sd开始时间,ed截止时间。    CREATE DEFINER = `root` @`%` FUNCTION `randDataTime` ( sd DATETIME, ed DATETIME ) RETURNS datetime DETERMINISTIC BEGIN      DECLARE          sub INT DEFAULT 0;      DECLARE          ret DATETIME;           SET sub = ABS (      UNIX_TIMESTAMP( ed )- UNIX_TIMESTAMP( sd ));           SET ret = DATE_ADD( sd, INTERVAL FLOOR( 1+RAND ()*( sub - 1 )) SECOND );      RETURN ret;   END $$   # 创建插入数据存储过程 CREATE DEFINER = `root` @`%` PROCEDURE `add_t_user_memory` ( IN n INT ) BEGIN      DECLARE          i INT DEFAULT 1;      WHILE              ( i <= n ) DO              INSERT INTO t_user_memory ( c_user_id, c_name, c_province_id, c_city_id, create_time )          VALUES              (                  uuid(),                  randStr ( 20 ),                  FLOOR( RAND() * 1000 ),                  FLOOR( RAND() * 100 ),                  randDataTime ( "2020-01-01" , "2021-01-01" ));                     SET i = i + 1;               END WHILE;   END $$ delimiter ;

4、执行存储过程

存储过程当中的数字就是要生成的数量,自行填写。

?
1 CALL add_t_user_memory(10);

100万大概需要8分钟!

5、遇到的问题

创建存储过程和执行的时候可能会出现以下两种问题:

5.1、1449错误

在创建存储过程的时候可能会出现1449:错误:

mysql 1449 : The user specified as a definer (‘root’@‘%’) does not exist

经查询是权限问题,解决办法:

运行sql:

?
1 2 grant all privileges on *.* to 'root' @ '%' identified by "." ; flush privileges ;

5.2、1114错误

当生成数量大的时候就可能会报这个错误:

解决方法:在my.cnf中修改max_heap_table_size = 256M tmp_table_size = 256M,重启MySQL服务(my.cnf在mysql安装路径),如果还不够用根据自己电脑自行修改。如果是线上服务器,最好不要自行修改,还是跟运维多沟通沟通,避免出现问题。

?
1 show VARIABLES like '%TABLE_size%' ;

改完可以在这进行查看:

6、同步数据

?
1 INSERT INTO t_user SELECT * FROM t_user_memory;

总结

到此这篇关于MySQL生成千万测试数据以及遇到的问题的文章就介绍到这了,更多相关MySQL生成千万测试数据内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_43888891/article/details/121223778

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容