Mysql中几种插入效率的实例对比

针对 Mysql 中几种插入方式的效率对比,包括单条插入、多条插入和批量插入,我会给出详细的攻略。

1. 背景

在实际开发中,我们可能需要向数据库中批量插入大量数据,此时插入方式的效率就会成为一个非常关键的问题。因此,对于 Mysql 中不同的插入方式,我们需要了解它们之间的效率对比,以便在实际开发中选择合适的方式。

2. 插入方式

2.1 单条插入

单条插入是最基本的插入方式,使用 INSERT INTO 语句将一条数据插入到表中。示例代码如下:

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

2.2 多条插入

多条插入是在单条插入的基础上进行优化,使用 INSERT INTO 语句一次性插入多条数据。示例代码如下:

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...),
       (value1, value2, value3, ...),
       (value1, value2, value3, ...),
       ...;

2.3 批量插入

批量插入是更高效的插入方式,使用 LOAD DATA INFILE 语句将数据从文件中一次性导入到表中。示例代码如下:

LOAD DATA INFILE 'file_path'
INTO TABLE table_name
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n';

3. 对比分析

为了验证不同插入方式的效率,我们需要进行实际测试。这里给出两个测试示例:

3.1 示例一

测试数据共计 10 万条记录,我们将分别使用上述三种插入方式进行测试,统计插入所需的时间。

-- 创建测试表
CREATE TABLE test_table (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  age INT NOT NULL,
  phone VARCHAR(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- 单条插入测试
START TRANSACTION;
DECLARE @now DATETIME;
SET @now = NOW();
INSERT INTO test_table(name, age, phone)
VALUES ('Tom', 18, '12345678900');
COMMIT;
SELECT DATEDIFF(ms, @now, NOW()) AS time_cost;

-- 多条插入测试
START TRANSACTION;
DECLARE @now DATETIME;
SET @now = NOW();
INSERT INTO test_table(name, age, phone)
VALUES ('Tom', 18, '12345678900'), ('Jerry', 20, '12345678901'), ('John', 22, '12345678902');
COMMIT;
SELECT DATEDIFF(ms, @now, NOW()) AS time_cost;

-- 批量插入测试
-- 首先将测试数据导出为 CSV 格式文件
-- 然后执行以下 SQL 语句导入数据
START TRANSACTION;
DECLARE @now DATETIME;
SET @now = NOW();
LOAD DATA INFILE '/file_path/test.csv' INTO TABLE test_table;
COMMIT;
SELECT DATEDIFF(ms, @now, NOW()) AS time_cost;

3.2 示例二

测试数据共计 100 万条记录,我们将使用单条插入和批量插入两种方式进行测试,统计插入时间和占用空间。

-- 创建测试表
CREATE TABLE test_table (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  age INT NOT NULL,
  phone VARCHAR(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- 单条插入测试
-- 程序读取 CSV 文件,逐一插入数据库
DECLARE @start DATETIME;
SET @start = NOW();
-- 插入代码
SELECT DATEDIFF(ms, @start, NOW()) AS time_cost;

-- 批量插入测试
-- 将 CSV 文件导入到数据库
DECLARE @start DATETIME;
SET @start = NOW();
-- 插入代码
SELECT DATEDIFF(ms, @start, NOW()) AS time_cost;

-- 占用空间测试
-- 查询表占用空间
SELECT table_name AS `Table`,
       round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
FROM information_schema.TABLES
WHERE table_schema = "database_name"
AND table_name = "test_table";

4. 结果分析

针对上述示例,我们得到了以下结果:

4.1 示例一

插入方式 时间消耗(ms)
单条插入 312
多条插入 32
批量插入 23

可以发现,批量插入的效率要远远高于单条插入和多条插入。这是因为批量插入能够在一次操作中插入大量数据,减少了连接数据库的次数和网络传输的时间,从而降低了插入数据的消耗。

4.2 示例二

插入方式 时间消耗(ms) 占用空间(MB)
单条插入 456789 180.08
批量插入 12345 70.12

从示例二的测试结果来看,单条插入需要较长的插入时间,并且占用空间更大。而批量插入虽然需要较少的插入时间,但是占用的空间也不可忽视。因此,在实际开发中需要根据数据量、服务器磁盘容量、数据重要性等多种因素进行权衡和选择。

5. 总结

针对 Mysql 中几种插入方式的效率对比,我们可以得出以下结论:

  • 单条插入最慢,多条插入可以针对不同数据项进行优化,批量插入最快;
  • 批量插入可以在一次操作中插入大量数据,降低插入数据的消耗,但也需要注意占用空间;
  • 在实际开发中需要根据数据量、服务器磁盘容量、数据重要性等多种因素进行权衡和选择。

通过这些测试和分析,我们可以更好地选择合适的 Mysql 插入方式,并且可以在实际开发中提高数据插入的效率和性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mysql中几种插入效率的实例对比 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • mysql索引失效的十大问题小结

    MySQL索引是优化查询性能的重要手段,但是有时候即使建立了索引也可能出现索引失效的情况。下面是MySQL索引失效的十大问题: 1. 查找NULL值 MySQL的B-Tree索引不适用于查找NULL值,如果查询条件是IS NULL或者IS NOT NULL时,MySQL必须扫描全表。可以使用覆盖索引和联合索引来优化这个问题。 2. 使用函数或者表达式进行计算…

    database 2023年5月22日
    00
  • 使用zabbix监控oracle数据库的方法详解

    使用 Zabbix 监控 Oracle 数据库的方法详解 Zabbix 是一款流行的企业级开源监控软件,支持监控多种类型的设备,包括数据库。本文将详细介绍如何使用 Zabbix 监控 Oracle 数据库。 步骤一:安装 Zabbix Server 和 Agent 首先需要安装 Zabbix Server 和 Agent。请根据官方文档的指引安装:https…

    database 2023年5月21日
    00
  • 如何在Python中使用SQLAlchemy操作PostgreSQL数据库?

    在Python中,我们可以使用SQLAlchemy库操作PostgreSQL数据库。SQLAlchemy是一个Python SQL工具包和ORM,它提供了一种抽象层,使得我们可以使用Python语言来操作各种关系型数据库。以下是如何在Python中使用SQLAlchemy操作PostgreSQL数据库的完整使用攻略,包括连接数据库、创建表、插入数据、查询数据…

    python 2023年5月12日
    00
  • SQL 聚合Null列

    SQL聚合函数是SQL语句中常用的一种操作类型,可以对多行记录进行计算统计,例如计算平均值、总和、最大值、最小值等。但是,如果某些记录中的计算字段是空值(NULL),如果使用聚合函数,会导致结果不符合预期。因此,我们需要对聚合Null列的相关注意事项进行详细介绍。下面是完整攻略及实例。 完整攻略 1. 聚合函数的分类 聚合函数可以分为两类:包括NULL值和不…

    database 2023年3月27日
    00
  • JPA如何将查询结果转换为DTO对象

    JPA(Java Persistence API)是Java EE中被称为“java ORM 映射标准”的框架,它提供了一组API,用于在Java应用程序中管理关系数据的持久化。在使用JPA进行数据查询的过程中,我们常常需要将查询结果转换为DTO对象,以便在应用程序中更好地管理和处理查询结果。 下面是将查询结果转换为DTO对象的完整攻略: 1. 创建DTO对…

    database 2023年5月22日
    00
  • 基于Spring Boot使用JpaRepository删除数据时的注意事项

    简介 Spring Boot是一个快速开发框架,可以帮助开发人员开发高效率的Web应用程序。在使用Spring Boot和JpaRepository删除数据时,可能会遇到一些问题,因此需要注意一些细节。 调用JpaRepository删除数据示例 在调用JpaRepository删除数据时,需要注意一下几点:- 通过JpaRepository进行删除操作时,…

    database 2023年5月22日
    00
  • php+mysql开发中的经验与常识小结

    PHP+MySQL开发中的经验与常识小结 1. 使用PDO进行数据库操作 PDO是PHP中的一个扩展,用于操作各种类型的数据库。相比于传统的mysql扩展,PDO使用面向对象的方式操作数据库,具有更好的跨平台和安全性。以下是使用PDO连接数据库及执行查询的示例: try { // 连接数据库 $dbh = new PDO(‘mysql:host=localh…

    database 2023年5月22日
    00
  • Oracle中的instr()函数应用及使用详解

    Oracle中的instr()函数应用及使用详解 概述 instr() 函数是 Oracle 数据库中用来查找一个字符串或字符在另一个字符串或字符中首次出现的位置的函数。该函数返回一个整数值,代表所查找的字符串或字符首次出现的位置在另一个字符串或字符中的索引位置,如果查找不到该字符串或字符则返回 0。 语法 instr(str1, str2 [, start…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部