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日

相关文章

  • 浅谈入门级oracle数据库数据导入导出步骤

    浅谈入门级Oracle数据库数据导入导出步骤 本文介绍Oracle数据库中常用的数据导入导出方法,其中包括使用exp/imp命令和使用数据泵(Data Pump)导入导出数据。 一、使用exp/imp命令导入导出数据 1. 导出数据 使用exp命令可以把数据以二进制形式导出到一个文件中。下面是使用exp命令导出数据的步骤: 登录到Oracle数据库 sqlp…

    database 2023年5月18日
    00
  • SQL Server2005打开数据表中的XML内容时报错的解决办法

    当我们使用SQL Server2005打开数据表中的XML内容时,有时会遇到以下报错: XML parsing: line 1, character 38, unable to switch the encoding 这是由于XML文件的编码方式与SQL Server2005默认编码方式不一致而导致的。为了解决这个问题,我们需要采取以下步骤: 了解XML文件…

    database 2023年5月18日
    00
  • T-SQL 和 PL-SQL 的区别

    T-SQL 和 PL-SQL 都是常用的数据库编程语言,T-SQL是Microsoft SQL Server的语言,而PL-SQL是Oracle数据库的语言。虽然两者都提供了类似的功能,但是它们在一些方面有很大的差异。下面我将详细讲解T-SQL和PL-SQL的区别以及它们的用途。 T-SQL和PL-SQL区别 1. 数据类型 T-SQL适用于Microsof…

    database 2023年3月27日
    00
  • Redis went away

    输入法业务于12月12日上线词库推送业务,根据用户uuid(uuid平台校验)进行词库推送,在12月17日早上8点多开始出现大量的php报错(Redis went away),报错导致了大量的链接积累,瞬间服务器的80端口堆积到了2w多导致了接收计费日志的接口全部返回超时,丢失了1小时的结费数据。 报错内容如下: [17-Dec-2018 01:32:51 …

    Redis 2023年4月13日
    00
  • mysql表分区的使用与底层原理详解

    MySQL表分区的使用与底层原理详解 MySQL表分区是一种将单个表拆分为多个文件或磁盘上的表的技术。表分区可以优化查询性能并减少维护成本。本篇文章将详细介绍MySQL表分区的使用和底层原理。 使用MySQL表分区 创建分区表 MySQL 5.1开始支持分区表,我们通过以下步骤来创建一个分区表: CREATE TABLE `orders` ( `id` IN…

    database 2023年5月18日
    00
  • Elasticsearch 和 MS SQL 的区别

    Elasticsearch和MS SQL是两种不同类型的数据库,具有不同的特点和用途。以下是它们之间的区别和相应的实例说明: 数据结构: Elasticsearch是一种搜索引擎,并且支持非结构化数据,它使用文档对象模型(DOM)存储数据。Elasticsearch可以自动创建索引,并且支持实时搜索和分析。 举个例子:在Elasticsearch中存储一份文…

    database 2023年3月27日
    00
  • nodejs+socketio+redis实现前端消息实时推送

    nodejs+socketio+redis实现前端消息实时推送 1. 后端部分 发送redis消息 可以参考此篇实现(直接使用Jedis即可) http://www.cnblogs.com/binyue/p/4763352.html 2.后端部分: 接收redis消息 var redis; if(process.argv.length <= 2){ r…

    Redis 2023年4月11日
    00
  • MySQL InnoDB的3种行锁定方式

    MySQL InnoDB引擎提供了三种行锁定方式:共享锁(S锁)、排它锁(X锁)和意向锁(IS锁和IX锁)。 共享锁(S锁) 共享锁(S锁)是用来保证读取的数据在事务间的一致性。多个事务可以同时获取共享锁定,因为他们都只是读取数据而不做任何修改。但是,一个事务获取了共享锁之后,其他事务便不能再对该行加排它锁。 语法:SELECT … FOR SHARE …

    MySQL 2023年3月10日
    00
合作推广
合作推广
分享本页
返回顶部