python快速生成mysql千万级测试数据

本文介绍了如何使用Python高效生成千万级的MySQL测试数据,包括用户表和用户关系表。通过生成txt文本并导入MySQL,实现了快速构建大规模数据集,为性能测试提供基础。文中详细记录了生成与导入数据的过程及耗时。

背景

在开发过程中,我们会做性能测试,但有些性能测试只有数据量达到一定程度的才能更好的测试出来。为此我们需要特意研究如何快速的生成千万级乃至亿级别的数据。

数据生成思路

  • 利用python生成千万级的txt文本数据
  • 将txt文本数据通过mysql的 load data infile语句导入到数据库中,这中方式非常高效,快到一千万的数据两分钟搞定,当然这取决于你每行的数据量。
  • 接下来就可以享受海量数据的体验啦。

生成千万级txt文本

在别的教程中,有用存储过程、临时内存表的方式,实现快速生成数据。我个人认为有以下不足

  • 生成数据真实性不高
  • 生成数据关联灵活性不高

如果利用python脚本,我们可以非常灵活的通过脚本代码来实现生成数据之间的关系与分布,而且我们可以利用pyton的一个开源的faker库,来生成各种看着不那么假的名字、地址、手机号、邮件等。git地址:faker

目标

我们模拟一个微博动态的一个过程,其中包含用户表,用户关注表,以及微博动态表。我们需要分析在一个用户有上百万的粉丝,微博动态的查询优化。

生成五百万用户数据

本来想用faker模拟真实数据,但是生成性能太低了,节约时间就暂时随意一点,空了会写个基于numpy的高性能随机

创建用户表

CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NULL,
  `email` varchar(255) NULL,
  `phone` varchar(20) NULL,
  PRIMARY KEY (`id`)
);

python脚本生成(耗时66s)

import os
from datetime import datetime


def build_data(file_path, data_count):
    if os.path.exists(file_path):
        os.remove(file_path)

    file = open(file_path
为了为 MySQL 数据库生成千万级测试数据,可以使用以下几种工具或网站来实现目标: ### 1. 使用 Python 脚本生成数据 Python 是一个非常强大的工具,可以编写脚本来生成大规模测试数据。例如,可以使用 Python 的 `Faker` 库生成随机数据,然后将其写入到 `.txt` 文件中,最后通过 MySQL 的 `LOAD DATA INFILE` 命令将数据导入数据库。这种方法效率高,适用于生成千万级的数据[^1]。 示例代码: ```python import random import string from datetime import datetime def random_string(length=10): return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) def generate_data(num_records): with open('test_data.txt', 'w') as f: for i in range(1, num_records + 1): name = random_string(10) age = random.randint(18, 60) email = f"{random_string(5)}@example.com" f.write(f"{name},{age},{email}\n") if __name__ == "__main__": generate_data(10_000_000) # 生成1000万条数据 ``` 导入数据到 MySQL: ```sql LOAD DATA INFILE '/path/to/test_data.txt' INTO TABLE test_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (name, age, email); ``` ### 2. 使用 MySQL 存储过程 MySQL 的存储过程也可以用来生成大规模数据。通过编写一个存储过程,可以快速生成千万级数据。这种方法的优点是不需要外部脚本,直接在数据库内部完成数据生成[^3]。 示例代码: ```sql DELIMITER // CREATE PROCEDURE generate_data() BEGIN DECLARE i INT DEFAULT 1; -- 创建表 CREATE TABLE IF NOT EXISTS test_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT, email VARCHAR(255) ); -- 插入1000万行数据 WHILE i <= 10000000 DO INSERT INTO test_table (name, age, email) VALUES ( CONCAT('Name', i), FLOOR(RAND() * 100) + 18, -- 随机年龄在18到118之间 CONCAT('email', i, '@example.com') ); SET i = i + 1; END WHILE; END // DELIMITER ; -- 调用存储过程 CALL generate_data(); ``` ### 3. 使用第三方工具 除了自定义脚本和存储过程,还可以使用一些现成的工具来生成测试数据: - **Mockaroo**:这是一个在线工具,可以生成大量随机数据,并支持多种格式导出,包括 CSV、JSON 等。Mockaroo 支持生成复杂的数据结构,适合需要特定数据格式的用户。 - **Faker**:这是一个 Python 库,专门用于生成假数据。它可以生成各种类型的数据,如姓名、地址、电话号码等。Faker 适合需要高度定制化数据的用户。 - **Data Generator for MySQL**:这是一个专门为 MySQL 设计的数据生成工具,支持生成各种类型的测试数据,并可以直接将数据导入到 MySQL 数据库中。 - **dbForge Data Generator for MySQL**:这是一个商业工具,提供了丰富的数据生成功能,支持生成大规模数据,并且可以自定义数据生成规则。 ### 4. 使用数据库引擎优化 在生成大规模数据时,选择合适的数据库引擎也很重要。MyISAM 引擎在插入数据时通常比 InnoDB 更快,因为它不支持事务和行级锁。因此,在生成数据时,可以考虑使用 MyISAM 引擎[^2]。 示例代码: ```sql CREATE TABLE `card` ( `card_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `card_number` varchar(100) DEFAULT NULL COMMENT '卡号', PRIMARY KEY (`card_id`) ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC; ``` ### 总结 生成千万级测试数据时,可以选择多种方法和工具。Python 脚本和 MySQL 存储过程是两种常见的方法,它们可以高效地生成大量数据。此外,还可以使用一些现成的工具,如 Mockaroo、Faker 和 dbForge Data Generator for MySQL,来简化数据生成过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值