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加载卡在硬盘上等待
LOAD DATA INFILE
:高速插入进行了基准测试。底线:LOAD DATA INFILE
使用加长刀片可以达到65%的性能 。我在现代硬件上每秒获得240,000次插入。