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


22

我读过一篇文章提到,通过使用该语句,可以从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');

那这个呢?


我写了一篇有关Medium的文章,对MySQL的扩展插入vs LOAD DATA INFILE:高速插入进行了基准测试。底线:LOAD DATA INFILE使用加长刀片可以达到65%的性能 。我在现代硬件上每秒获得240,000次插入。
— 本杰明

Answers:


26

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缓冲区,就可以使用这两种方法进行学术研究,并归结为个人选择。对于仅按需批量插入INSERT的应用程序,请坚持使用扩展的INSERT。

公平地说,说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的最新文章:Infile的Mysql加载卡在硬盘上等待


4

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

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


3

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

每个INSERT语句必须由MySQL引擎单独解析并检查有效性-这会消耗额外的CPU资源,并且还需要更多的client <> server往返。通过批量加载时,无需发生这种情况LOAD DATA INFILE。当LOAD DATA INFILE用于加载到空表中时,也会进行优化。有关更多信息,请参见此链接。


看到我的问题的编辑部分。
— ALH 2012年

请注意,使用准备好的语句时没有解析开销。
— 本杰明
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.