网站建设 更新 维护如何推广店铺呢
场景:
需要拿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.
【完结撒花】
后续可以分析测试优化性能了。例如处理全表扫描索引扫描等等,后续看时间更新吧。。。