服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL生成千万测试数据以及遇到的问题

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

2022-08-03 16:16怪 咖@ Mysql

前两天发现同事要做一个对大表进行范围查询的功能,所以需要生成千万数据进行性能测试,下面这篇文章主要给大家介绍了关于MySQL生成千万测试数据以及遇到的问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参

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分钟!

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

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错误

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

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

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

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

?
1
show VARIABLES like '%TABLE_size%';

改完可以在这进行查看:

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

6、同步数据

?
1
INSERT INTO t_user SELECT * FROM t_user_memory;

总结

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

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

延伸 · 阅读

精彩推荐
  • MysqlMySQL并发更新数据时的处理方法

    MySQL并发更新数据时的处理方法

    在后端开发中我们不可避免的会遇见MySQL数据并发更新的情况,作为一名后端研发,如何解决这类问题也是必须要知道的,同时这也是面试中经常考察的知...

    Caizhenhao3112020-09-28
  • MysqlMySQL优化必须调整的10项配置

    MySQL优化必须调整的10项配置

    这篇文章主要介绍了MySQL优化必须调整的10项配置,使用这些方法可以让你快速地获得一个稳健的MySQL配置,需要的朋友可以参考下 ...

    MYSQL教程网5542020-03-19
  • Mysql巧用mysql提示符prompt清晰管理数据库的方法

    巧用mysql提示符prompt清晰管理数据库的方法

    随着管理mysql服务器越来越多,同样的mysql>的提示符有可能会让你输入错误的命令到错误的数据库,这时候需要巧用mysql的提示符,这是我的提示符root@loc...

    mysql教程网3262019-10-31
  • MysqlMySQL为Null会导致5个问题(个个致命)

    MySQL为Null会导致5个问题(个个致命)

    这篇文章主要介绍了MySQL为Null会导致5个问题(个个致命),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    kevin_吴敏6332021-03-30
  • Mysql基于Windows安装MySQL 8.0.12图文教程

    基于Windows安装MySQL 8.0.12图文教程

    这篇文章主要为大家详细介绍了基于Windows安装MySQL 8.0.12图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    南邮吴亦凡1722020-12-01
  • Mysql简单讲解MySQL的数据库复制方法

    简单讲解MySQL的数据库复制方法

    这篇文章主要介绍了简单讲解MySQL的数据库复制方法,利用到了常见的mysqldump工具,需要的朋友可以参考下 ...

    冰&红&茶5482020-05-25
  • MysqlMySQL无法存储emoji表情解决方案分析

    MySQL无法存储emoji表情解决方案分析

    这篇文章主要介绍了MySQL无法存储emoji表情解决方案,结合实例形式分析了Python爬虫爬取文章中emoji表情存入数据库的实现方法,涉及mysql utf8mb4编码的修改相关...

    站在两个世界的边缘5342019-07-01
  • Mysqlwindows10下mysql 8.0 下载与安装配置图文教程

    windows10下mysql 8.0 下载与安装配置图文教程

    这篇文章主要介绍了windows10下mysql 8.0 下载与安装配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Admin_xz5432020-09-12