哪个插入查询运行得更快、更准确


Which Insert query run faster and accurate?

我必须将数据插入MySQL数据库(约200,000)。我对插入查询有点困惑。我有两个选项将数据插入 MySQL:

INSERT INTO paper VALUES('a','b','c','d');
INSERT INTO paper VALUES('e','f','g','h');
INSERT INTO paper VALUES('k','l','m','n');

INSERT INTO paper VALUES('a','b','c','d'),('e','f','g','h'),('k','l','m','n');

哪个插入查询执行得更快?查询之间有什么区别?

TL;TR

第二个查询会更快。为什么?阅读下文...

基本上,查询分不同的步骤执行:

  • 连接:两个版本的代码都必须执行此操作
  • 向服务器发送查询:适用于两个版本,只有第二个版本仅发送一个查询
  • 解析查询:同上,两个版本都需要解析查询,第二个版本只需要解析 1 个查询,不过
  • 插入行:两种情况相同
  • 插入索引:同样,理论上两种情况都相同。我希望MySQL在第二种情况下批量插入后构建更新索引,使其可能更快。
  • 结束语:两种情况相同

当然,这并不能说明全部情况:表锁对性能有影响,MySQL配置,预准备语句和事务的使用也可能导致更好(或更差)的性能。当然,数据库服务器的设置方式也会有所不同。
所以我们回到古老的口头禅:

如有疑问:测试!

根据测试告诉您的内容,您可能需要更改某些配置,然后再次测试,直到找到最佳配置。

对于大数据集,理想的折衷方案可能是两个版本的组合:

LOCK TABLE paper WRITE
/* chunked insert, with lock, probably add transaction here, too */
INSERT INTO paper VALUES ('a', 'z'), ('b','c');
INSERT INTO paper VALUES ('a', 'z'), ('b','c');
UNLOCK TABLES;

只是RTM - MySQL插入速度:

如果要同时插入来自同一客户端的多行,请使用具有多个 VALUES 列表的 INSERT 语句一次插入多行。这比使用单独的单行 INSERT 语句要快得多(在某些情况下快很多倍)。如果要将数据添加到非空表中,则可以调整 bulk_insert_buffer_size 变量以使数据插入更快。请参见第 5.1.4 节 "服务器系统变量"。

如果您不能使用多个值,那么锁定也是加快插入速度的简单方法,如同一页面上所述:

要加快对非事务表执行的多个语句执行的 INSERT 操作,请锁定表:

LOCK TABLES a WRITE;
INSERT INTO a VALUES (1,23),(2,34),(4,33);
INSERT INTO a VALUES (8,26),(6,29);
/* ... */
UNLOCK TABLES;

这有利于提高性能,因为在完成所有 INSERT 语句后,索引缓冲区仅刷新到磁盘一次。通常,索引缓冲区刷新次数与 INSERT 语句数一样多。如果可以使用单个 INSERT 插入所有行,则不需要显式锁定语句。

通读整个页面以了解详细信息

我不确定纯数据库端哪个更快。但是当你从PHP脚本调用数据库时,第二种方式应该更快,因为你在多次调用中节省了资源。

无论如何。只有一种方法可以知道。测试一下。