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

时间:2015-01-13 10:55:15

标签: php mysql insert

我必须将数据插入MySQL数据库(appox.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');

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

2 个答案:

答案 0 :(得分:5)

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 insert speed

  

如果要同时从同一客户端插入多行,请使用带有多个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插入所有行,则不需要显式锁定语句。

阅读整个页面了解详情

答案 1 :(得分:2)

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

反正。只有一种方法可以了解。测试它。