MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

本文主要是介绍MySQL 批量插入的原理和实战方法(快速提升大数据导入效率),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ...

在日常开发中,我们经常需要将大量数据批量插入到 MySQL 数据库中。然而,逐行插入(单条执行 INSERT INTO)的方式效率较低,尤其在处理大规模数据时,会导致性能瓶颈。为了解决这个问题,我们可以使用批量插入技术,显著提升数据插入效率。本文将介绍批www.chinasem.cn量插入的原理、实现方法,并结合 Python 和 PyMySQL 库提供详细的实战示例。

一、批量插入的优势

批量插入数据有以下几个优点:

  1. 减少网络交互:批量插入一次性传输多条记录,减少客户端与数据库之间的网络通信次数。
  2. 提高事务效率:批量插入可以减少事务的提交次数,从而降低事务管理的开销。
  3. 提高插入性能:批量插入可以有效地降低数据库的锁定资源时间,使插入操作更高效。

二、MySQL 表的创建示例

我们以学生信息表为例,假设有如下的表结构:

CREATE TABLE students (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    age INT,
    gender ENUM('M', 'F'),
    grade VARCHAR(10)
);

students 用于存储学生的基本信息,包括 id(主键),name(姓名),age(年龄),gender(性别),以及 grade(成绩)。

三、Python 实现批量插入

接下来,我们使用 Python 的 PyMySQL 库来连接 MySQL,并实现批量插入数据。

1. 安装 PyMySQL 和 Faker 库

首先,确保已经安装了 PyMySQLFaker 库。如果尚未安装,可以使用以下命令进行安装:

pip install pymysql faker

2. 生成 1 万条随机的学生数据

使用 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)

3. 批量插入数据到 MySQL

批量插入的核心思路是将数据分成若干批次,使用 executemany 方法执行批量插入操作。下面是批量插入的完整代码:

import pymysql
from tqdm import tqdm
# 创建数据库连接
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 = """
              javascript  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()

4. 代码详解

  1. 生成随机数据:使用 generate_random_students 函数生成 1 万条随机学生数据,并存储在 students_data 列表中。
  2. 数据库连接:使用 PyMySQL 连接到 MySQL 数据库,并禁用自动提交模式,以便手动管理事务。
  3. 批量插入
    • 将数据分成大小为 BATCH_SIZE 的批次进行插入操作。
    • 使用 cursor.executemany 方法批量插入每个批次的数据,这样可以减少 SQL 执行次数,提高效率。
  4. 处理剩余数据:如果数据量不足一个批次,最后将剩余数据插入。
  5. 事务管理:在插入成功后调用 connection.commit() 提交事务,如果发生错误则进行回滚。
  6. 关闭连接:无论操作是否成功,都需要关闭数据库连接。

四、性能优化建议

  1. 调整批次大小:可以根据具体的硬件和数据量情况,适当调整批次大小(BATCH_SIZE),通常 500 到 1000 条为一个批次较为合适。
  2. 禁用自动提交:将自动提交模式禁用(connection.autocommit(False)),可以提高插入效率。
  3. 删除或禁用索引:在大量数据插入时,可以暂时禁用或删除表上的索引,插入完成后再重新建立索引。
  4. 批量插入语句优化:可以将 INSERT INTO 语句改为 INSERT IGNOREINSERT ON DUPLICATE KEY UPDATE 来处理China编程主键冲突的情况。
  5. unique: 尽量少用unique。当表的数据量很大时,每插入一个数据都会判断该值是否唯一,会导致数据插入数据越来越慢。

五、总结

批量插入是提高 MySQL 数据插入性能的重要手段。通过使用批量插入技术,可以显著减少 SQL 执行次数,提高数据导入的效率。本文通过一个学生信息表的实战示例,详细介绍了批量插入的实现方法,并提供了性能优化的建议。希望这篇文章对您在处理大规模数据时有所帮助。

如果有更复杂的数据处理需求,您还可以考虑使用 MySQL 的 LOAD DATA 编程语句或专门的 ETL 工具来进行数据导入操作。

到此这篇关于MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)的文章就介绍到这了,更多相关mysql批量插入内容请搜索China编程(www.cppcpythonns.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156227

相关文章

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

springboot中配置logback-spring.xml的方法

《springboot中配置logback-spring.xml的方法》文章介绍了如何在SpringBoot项目中配置logback-spring.xml文件来进行日志管理,包括如何定义日志输出方式、... 目录一、在src/main/resources目录下,也就是在classpath路径下创建logba