生成 1 万条随机的学生数据 并 批量存入数据库
生成 1 万条随机的学生数据
批量插入的优势
批量插入数据有以下几个优点:
减少网络交互:批量插入一次性传输多条记录,减少客户端与数据库之间的网络通信次数。
提高事务效率:批量插入可以减少事务的提交次数,从而降低事务管理的开销。
提高插入性能:批量插入可以有效地降低数据库的锁定资源时间,使插入操作更高效。
MySQL 表的创建示例
CREATE TABLE students ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100), age INT, gender ENUM('M', 'F'), grade VARCHAR(10) );
使用 Faker 库生成随机的学生信息数据,包括姓名、年龄、性别和成绩。以下是生成数据的代码:
import random from faker import Faker # 初始化 Faker fake = Faker() # 随机生成学生数据 def generate_random_students(num_records=10000): students_data = [] for _ in range(num_records): name = fake.name() age = random.randint(18, 25) # 随机年龄在 18 到 25 岁之间 gender = random.choice(['M', 'F']) # 随机选择性别 grade = random.choice(['A', 'B', 'C', 'D', 'F']) # 随机选择成绩 students_data.append((name, age, gender, grade)) return students_data # 生成 1 万条学生数据 students_data = generate_random_students(10000) # 输出前 5 条数据查看 for student in students_data[:5]: print(student)
批量插入数据到 MySQL
批量插入的核心思路是将数据分成若干批次,使用 executemany 方法执行批量插入操作。下面是批量插入的完整代码:
import pymysql from tqdm import tqdm
tqdm是一个快速、可扩展的Python进度条,可以在Python长循环中添加一个进度提示信息,用户只需要封装任意的迭代器tqdm(iterator)。它可以帮助我们监测程序运行的进度,估计运行的时长,甚至可以协助debug。对于在长时间运行的任务中显示进度很有用,因为它可以让用户知道任务正在进行。
原文链接:https://blog.csdn.net/AI_dataloads/article/details/134169038
# 创建数据库连接 connection = pymysql.connect( host='localhost', user='your_username', password='your_password', database='your_database', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) # 批量插入的批次大小 BATCH_SIZE = 1000 try: with connection.cursor() as cursor: batch = [] for student in tqdm(students_data, total=len(students_data)): batch.append(student) # 当批次达到 BATCH_SIZE 时执行批量插入 if len(batch) >= BATCH_SIZE: sql = """ INSERT INTO students (name, age, gender, grade) VALUES (%s, %s, %s, %s) """ cursor.executemany(sql, batch) batch = [] # 清空批次 # 插入剩余的未满批次的数据 if batch: sql = """ INSERT INTO students (name, age, gender, grade) VALUES (%s, %s, %s, %s) """ cursor.executemany(sql, batch) # 提交事务 connection.commit() except Exception as e: print(f"插入数据时出现错误: {e}") connection.rollback() finally: # 关闭数据库连接 connection.close()
代码详解
生成随机数据:使用 generate_random_students 函数生成 1 万条随机学生数据,并存储在 students_data 列表中。
数据库连接:使用 PyMySQL 连接到 MySQL 数据库,并禁用自动提交模式,以便手动管理事务。
批量插入:
将数据分成大小为 BATCH_SIZE 的批次进行插入操作。
使用 cursor.executemany 方法批量插入每个批次的数据,这样可以减少 SQL 执行次数,提高效率。
处理剩余数据:如果数据量不足一个批次,最后将剩余数据插入。
事务管理:在插入成功后调用 connection.commit() 提交事务,如果发生错误则进行回滚。
关闭连接:无论操作是否成功,都需要关闭数据库连接。
性能优化建议
调整批次大小:可以根据具体的硬件和数据量情况,适当调整批次大小(BATCH_SIZE),通常 500 到 1000 条为一个批次较为合适。
禁用自动提交:将自动提交模式禁用(connection.autocommit(False)),可以提高插入效率。
删除或禁用索引:在大量数据插入时,可以暂时禁用或删除表上的索引,插入完成后再重新建立索引。
批量插入语句优化:可以将 INSERT INTO 语句改为 INSERT IGNORE 或 INSERT ON DUPLICATE KEY UPDATE 来处理主键冲突的情况。
unique: 尽量少用unique。当表的数据量很大时,每插入一个数据都会判断该值是否唯一,会导致数据插入数据越来越慢。
原文链接:https://blog.csdn.net/sjxgghg/article/details/143227262
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)