我读过一篇文章,提到我们可以通过使用从 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');
那这个呢?
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 文档:
多年来,我看到一个又一个客户没有设置这个并将其保留为 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
您也可以在启动扩展 INSERT 之前为您的会话设置它
更新 2012-07-19 14:58 EDT
为了让事情更清晰,批量插入缓冲区仅对加载 MyISAM 表有用,对 InnoDB 无效。我最近写了一篇关于批量加载 InnoDB 的文章:Mysql load from infile 在硬盘上等待
大多数数据库管理系统都有一个批量加载工具,可以快速加载大量数据。一条
INSERT
语句有大量的每条语句包袱——锁定、事务划分、参照完整性检查、资源分配、必须在每条语句的基础上完成的 I/O。批量插入操作简化了流程,因此这些东西每行的开销要少得多。DBMS 可以比通过插入语句更快地批量加载数据数量级。
与将 CSV 文件拆分为列并直接加载它们相比,解析和执行单个
INSERT
语句的开销要大得多。每个
INSERT
语句都必须由 MySQL 引擎单独解析并检查其有效性——这会消耗额外的 CPU 资源并且还需要更多的客户端<>服务器往返。通过批量加载时不需要发生这种情况LOAD DATA INFILE
。LOAD DATA INFILE
当用于加载到空表中时,还可以进行一些优化。有关更多信息,请参阅此链接。