快速生成mysql测试数据10w条
场景:
需要拿10w条数据测试数据库的性能优化,查看是否合理。之前有的项目数据量很小,后面遇到大的项目难免吃亏。遂决定进行此次测试。
使用环境:
win10
使用工具:
mysql workbench --mysql官网自带的IDE,可以用dbeaver等替换
powershell --同理,cmd也可以
deepseek --搜索报错
思路:
此次会使用Python脚本test.py生成测试数据文件test_data.csv,然后使用导入文件命令导入mysql数据到mysql容器中。
【 相对insert单条输入和事务输入,文件导入效率更高】
使用步骤:
1. 安装python
win10 测试是否安装python3,powershell输入python,
有会显示python版本,没有会自动跳出微软商店安装python
下图为输入后显示的版本:
2.放入python脚本
保存为test.py 【此处方便测试,我放在桌面位置,大家可以随便放】
import csv
import random
from datetime import datetime, timedelta
from faker import Faker
# 初始化Faker库
fake = Faker('zh_CN')
# 预定义的创建人和更新人列表
creators = ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十']
updaters = creators + ['系统自动', '管理员', '自动任务']
# 生成随机日期(过去5年内)
def random_date(start_date=None):
if start_date is None:
start_date = datetime.now() - timedelta(days=5*365)
end_date = datetime.now()
return start_date + timedelta(seconds=random.randint(0, int((end_date - start_date).total_seconds())))
# 生成10万条测试数据
def generate_test_data(num_records=100000):
data = []
for i in range(num_records):
# 生成创建日期(确保更新日期不早于创建日期)
create_date = random_date()
update_date = random_date(create_date)
record = {
'ID': i + 1,
'姓名': fake.name(),
'年龄': random.randint(1, 100),
'创建日期': create_date.strftime('%Y-%m-%d %H:%M:%S'),
'创建人': random.choice(creators),
'更新日期': update_date.strftime('%Y-%m-%d %H:%M:%S'),
'更新人': random.choice(updaters)
}
data.append(record)
return data
# 保存为CSV文件
def save_to_csv(data, filename='test_data.csv'):
with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
fieldnames = ['ID', '姓名', '年龄', '创建日期', '创建人', '更新日期', '更新人']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(data)
print(f"数据已保存到 {filename}")
# 生成并保存数据
test_data = generate_test_data(100000)
save_to_csv(test_data)
3.执行python脚本
python C:\Users\admin\Desktop\test.py --linux环境
python.exe .\test.py --win10环境
现在测试数据已经生成,
4. 打开mysqlworkbench
建表
CREATE TABLE `test_data` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '姓名',
`age` tinyint unsigned NOT NULL COMMENT '年龄',
`create_time` datetime NOT NULL COMMENT '创建日期',
`creator` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '创建人',
`update_time` datetime NOT NULL COMMENT '更新日期',
`updater` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '更新人',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='测试数据表'
4.1 点击配置
点击Advanced -> Others 里输入 OPT_LOCAL_INFILE=1
【此处不设置会报错:Error Code: 2068. LOAD DATA LOCAL INFILE file request rejected due to restrictions on access. 在 MySQL Workbench 中遇到 Error Code: 2068(LOAD DATA LOCAL INFILE
被拒绝)是因为 MySQL 默认出于安全考虑禁用了客户端本地文件加载功能。】
4.2 执行
在workbench里执行
LOAD DATA LOCAL INFILE 'C:/Users/admin/Desktop/test_data.csv'
INTO TABLE test_data FIELDS TERMINATED BY ','
ENCLOSED BY '"' LINES TERMINATED BY '\n'
IGNORE 1 ROWS (id, name, age, create_time, creator, update_time, updater)
脚本释义
执行成功:
5.查看数据
SELECT * FROM demo.test_data;
select count(*) from demo.test_data;
Done.
【完结撒花】
后续可以分析测试优化性能了。例如处理全表扫描索引扫描等等,后续看时间更新吧。。。