Mysql 生成亿级测试数据

  • 先建数据表
CREATE TABLE `card1` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `number` varchar(254) NOT NULL DEFAULT '' COMMENT '卡号',
 `user` varchar(60) NOT NULL DEFAULT '' COMMENT '用户',
 `password` varchar(254) NOT NULL DEFAULT '' COMMENT '密码',
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC
  • 使用存储过程生成测试数据,修改n的值可以得到任意条数的测试数据
DROP PROCEDURE IF EXISTS proc1;
DELIMITER $$
SET AUTOCOMMIT = 0$$
CREATE  PROCEDURE proc1()
BEGIN
DECLARE n DECIMAL (10)  DEFAULT 0 ;
dd:LOOP
          INSERT  INTO card1(number,user,password) VALUES (UUID(),concat('user-',n),password(n));
                  COMMIT;
                    SET n = n+1 ;
                           IF  n = 100000000 THEN LEAVE dd;
                          END IF;
         END LOOP dd ;
END;$$
DELIMITER ;
  • 这里先把 n 改成了1000W,近5分钟就成功生成了测试数据
mysql> call proc1;
Query OK, 0 rows affected (4 min 47.15 sec)

mysql> select count('id') from card;
+-------------+
| count('id') |
+-------------+
|    10000000 |
+-------------+
1 row in set (0.01 sec)


mysql> select * from card where id =1234567;
+---------+--------------------------------------+-------------+-------------------------------------------+
| id      | number                               | user        | password                                  |
+---------+--------------------------------------+-------------+-------------------------------------------+
| 1234567 | 3d3d1209-948c-11e8-b070-0800272d882f | user1234566 | *DBEE43222EB6DDDECB028FAF6C4909E502562D67 |
+---------+--------------------------------------+-------------+-------------------------------------------+
1 row in set (0.00 sec)

mysql> desc select * from card where id =1234567;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | card  | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)





mysql>  select * from card where user='user1234567';
+---------+--------------------------------------+-------------+-------------------------------------------+
| id      | number                               | user        | password                                  |
+---------+--------------------------------------+-------------+-------------------------------------------+
| 1234568 | 3d3d12f3-948c-11e8-b070-0800272d882f | user1234567 | *6A7A490FB9DC8C33C2B025A91737077A7E9CC5E5 |
+---------+--------------------------------------+-------------+-------------------------------------------+
1 row in set (2.05 sec)

mysql> desc select * from card where user='user1234567';
+----+-------------+-------+------------+------+---------------+------+---------+------+----------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows     | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+----------+----------+-------------+
|  1 | SIMPLE      | card  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 10000000 |    10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+----------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

  • 这里测试生成1亿条数据,生成速度极为缓慢,大概需要50分钟左右
mysql> call proc1;
Query OK, 0 rows affected (50 min 35.22 sec)

mysql> select count('id') from card;
+-------------+
| count('id') |
+-------------+
|   100000000 |
+-------------+
1 row in set (0.01 sec)

mysql> select * from card where id=1;
+----+--------------------------------------+--------+-------------------------------------------+
| id | number                               | user   | password                                  |
+----+--------------------------------------+--------+-------------------------------------------+
|  1 | 3daf67c2-948e-11e8-b070-0800272d882f | user-0 | *B12289EEF8752AD620294A64A37CD586223AB454 |
+----+--------------------------------------+--------+-------------------------------------------+
1 row in set (0.01 sec)



  • 修改存储引擎
mysql> ALTER TABLE card  ENGINE=InnoDB;
Query OK, 100000000 rows affected (18 min 24.62 sec)
Records: 100000000  Duplicates: 0  Warnings: 0

mysql> select count('id') from card;
+-------------+
| count('id') |
+-------------+
|   100000000 |
+-------------+
1 row in set (1 min 7.50 sec)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以使用MySQL的内置函数和语句来生成测试数据。以下是一些常用的方法: 1. 使用INSERT INTO语句:使用INSERT INTO语句将手动添加的数据插入到表中。例如,如果有一个名为"users"的表,可以使用以下语句插入测试数据: ``` INSERT INTO users (name, age) VALUES ('John', 25), ('Jane', 30), ('Bob', 35); ``` 2. 使用SELECT INTO语句:使用SELECT INTO语句从现有的表中选择数据并插入到新表中。例如,可以使用以下语句从现有的"users"表中选择前10行数据并插入到新的"test_users"表中: ``` CREATE TABLE test_users SELECT * FROM users LIMIT 10; ``` 3. 使用生成函数:MySQL提供了一些内置的生成函数,可以用于生成随机或递增的数据。例如,可以使用RAND()函数生成随机数,并将其插入到表中: ``` INSERT INTO table_name (column1, column2) VALUES (RAND(), RAND()); ``` 4. 使用循环语句:可以使用循环语句(如WHILE或FOR)在存储过程或函数中生成大量的测试数据。例如,可以使用存储过程生成指定数量的随机用户数据: ``` DELIMITER // CREATE PROCEDURE generate_test_data(IN num_rows INT) BEGIN DECLARE i INT DEFAULT 1; WHILE i <= num_rows DO INSERT INTO users (name, age) VALUES (CONCAT('User', i), FLOOR(RAND() * 100)); SET i = i + 1; END WHILE; END // DELIMITER ; CALL generate_test_data(1000); ``` 这是一些常用的方法来生成测试数据。根据你的具体需求和数据库结构,你可以选择适合的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值