Ali*_*eza 22 mysql bulk import
我读过一篇文章,提到我们可以通过使用该语句实现每秒 60,000 次插入,该LOAD DATA IN FILE语句从 csv 文件中读取并将数据插入到数据库中。
为什么它应该与普通刀片不同?
编辑:
我通过只调用一个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');
Run Code Online (Sandbox Code Playgroud)
那这个呢?
Rol*_*DBA 27
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
Run Code Online (Sandbox Code Playgroud)
您也可以在启动扩展 INSERT 之前为您的会话设置它
SET bulk_insert_buffer_size= 1024 * 1024 * 256;
Run Code Online (Sandbox Code Playgroud)
为了正确起见,批量插入缓冲区仅用于加载 MyISAM 表,而不是 InnoDB。我最近写了一篇关于批量加载 InnoDB 的帖子:来自 infile 的 Mysql 加载卡在等待硬盘驱动器上
大多数数据库管理系统都有批量加载功能,可以快速加载大量数据。一条INSERT语句具有大量的每语句包袱——锁定、事务划分、引用完整性检查、资源分配、必须在每条语句的基础上完成的 I/O。
批量插入操作简化了流程,因此每行的开销要少得多。DBMS 批量加载数据的速度比通过插入语句快几个数量级。
| 归档时间: |
|
| 查看次数: |
35427 次 |
| 最近记录: |