为什么“ 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.