AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 16809
Accepted
Alireza
Alireza
Asked: 2012-04-21 02:35:01 +0800 CST2012-04-21 02:35:01 +0800 CST 2012-04-21 02:35:01 +0800 CST

为什么 'LOAD DATA INFILE' 比普通的 INSERT 语句快?

  • 772

我读过一篇文章,提到我们可以通过使用从 csv 文件读取并将数据插入数据库的语句来实现每秒 60,000 次插入。LOAD DATA IN FILE

为什么它与普通刀片不同?

编辑:我通过调用一个语句
减少了往返:INSERT

INSERT INTO tblname
VALUES (NULL,2,'some text here0'),(NULL,2,'some text here1')
    ,(NULL,2,'some text here2'),(NULL,2,'some text here3')
    .....,(NULL,2,'some text here3000');

那这个呢?

mysql import
  • 3 3 个回答
  • 37196 Views

3 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-04-21T05:36:25+08:002012-04-21T05:36:25+08:00

    LOAD DATA INFILE 和扩展 INSERT 各有其独特的优势。

    LOAD DATA INFILE 设计用于在单个操作中大量加载表数据以及执行以下操作:

    • 跳过初始行
    • 跳过特定列
    • 转换特定列
    • 加载特定列
    • 处理重复的关键问题

    解析所需的开销更少

    另一方面,如果您只导入 100 行而不是 1,000,000 行,则扩展 INSERT 是明智的。

    请注意,mysqldump 是围绕扩展 INSERT 设计的,以便在每个 INSERT 执行数百或数千行注入时将表设计与数据一起携带。LOAD DATA INFILE 总是在模式和数据之间创建物理二分法。

    从应用程序的角度来看,LOAD DATA INFILE 对模式更改也比扩展 INSERT 更不敏感。

    使用 LOAD DATA INFILE 的好处、坏处和丑陋之处可以来回回溯。无论您使用哪种技术,都必须始终设置bulk_insert_buffer_size。为什么?

    根据 bulk_insert_buffer_size 上的 MySQL 文档:

    MyISAM 使用特殊的树状缓存来使 INSERT ... SELECT、INSERT ... VALUES (...)、(...)、... 和 LOAD DATA INFILE 的批量插入更快表。此变量限制每个线程的缓存树大小(以字节为单位)。将其设置为 0 会禁用此优化。默认值为 8MB。

    多年来,我看到一个又一个客户没有设置这个并将其保留为 8MB。然后,当他们决定使用 LOAD DATA INFILE 或导入 mysqldumps 时,他们会感觉到有问题。我通常建议将其设置为适中的 256M。在某些情况下,512M。

    一旦你有足够大的批量 INSERT 缓冲区,使用任何一种技术都会变得学术化,归结为个人选择。对于按需批量插入 100 行的应用程序,请坚持使用扩展插入。

    平心而论,说 LOAD DATA INFILE 比普通的 INSERT 语句更快是一种加载语句,主要是因为没有考虑到配置。即使您使用适当的 bulk_insert_buffer_size 在 LOAD DATA INFILE 和扩展 INSERT 之间设置基准,在解析每一行时节省的纳秒最多只能产生名义上的结果,有利于 LOAD DATA INFILE。

    继续并将其添加到 my.cnf

    [mysqld]
    bulk_inset_buffer_size=256M
    

    您也可以在启动扩展 INSERT 之前为您的会话设置它

    SET bulk_insert_buffer_size= 1024 * 1024 * 256;
    

    更新 2012-07-19 14:58 EDT

    为了让事情更清晰,批量插入缓冲区仅对加载 MyISAM 表有用,对 InnoDB 无效。我最近写了一篇关于批量加载 InnoDB 的文章:Mysql load from infile 在硬盘上等待

    • 28
  2. ConcernedOfTunbridgeWells
    2012-04-21T04:37:20+08:002012-04-21T04:37:20+08:00

    大多数数据库管理系统都有一个批量加载工具,可以快速加载大量数据。一条INSERT语句有大量的每条语句包袱——锁定、事务划分、参照完整性检查、资源分配、必须在每条语句的基础上完成的 I/O。

    批量插入操作简化了流程,因此这些东西每行的开销要少得多。DBMS 可以比通过插入语句更快地批量加载数据数量级。

    • 4
  3. Philᵀᴹ
    2012-04-21T02:42:23+08:002012-04-21T02:42:23+08:00

    与将 CSV 文件拆分为列并直接加载它们相比,解析和执行单个INSERT语句的开销要大得多。

    每个INSERT语句都必须由 MySQL 引擎单独解析并检查其有效性——这会消耗额外的 CPU 资源并且还需要更多的客户端<>服务器往返。通过批量加载时不需要发生这种情况LOAD DATA INFILE。LOAD DATA INFILE当用于加载到空表中时,还可以进行一些优化。有关更多信息,请参阅此链接。

    • 3

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve