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

Php 哪个插入查询运行得更快更准确?,php,mysql,insert,Php,Mysql,Insert,我必须将数据插入MySQL数据库appox。200,000. 我对insert查询有点困惑。我有两个选项可以将数据插入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查询执行得更快?这两个查询之间有什么区别?我不确定哪一个在纯数据库方面更快。但当您从PH

我必须将数据插入MySQL数据库appox。200,000. 我对insert查询有点困惑。我有两个选项可以将数据插入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查询执行得更快?这两个查询之间有什么区别?

我不确定哪一个在纯数据库方面更快。但当您从PHP脚本调用数据库时,第二种方法应该更快,因为您可以在多次调用中节省资源

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

TL;TR 第二个查询将更快。为什么?请看下面

基本上,查询是通过不同的步骤执行的:

连接:两个版本的代码都必须这样做 向服务器发送查询:适用于两个版本,只有第二个版本只发送一个查询 解析查询:与上面相同,两个版本都需要解析查询,但第二个版本只需要解析一个查询 插入行:两种情况下相同 插入索引:这两种情况在理论上也是一样的。在第二种情况下,我希望MySQL在大容量插入之后构建并更新索引,从而可能更快。 关闭:两种情况下相同 当然,这并不是全部:表锁对性能有影响,MySQL配置、使用准备好的语句和事务也可能导致性能的提高或降低。当然,DB服务器的设置方式也会有所不同。 所以我们回到古老的咒语:

怀疑时:测试! 根据测试结果,您可能需要更改一些配置,然后再次测试,直到找到最佳配置

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

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-:

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

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

要加快对非事务表使用多条语句执行的插入操作,请锁定表:

这有利于性能,因为索引缓冲区在所有INSERT语句完成后只刷新到磁盘一次。通常,索引缓冲区刷新的数量与INSERT语句的数量相同。如果可以通过一次插入插入所有行,则不需要显式锁定语句


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

嗯,你可以,嗯,测试一下吗?这个问题似乎离题了,因为它是关于做和测试ittry to test,第二个选项是因为它在数据库中遇到了一个查询。不管怎样,你都应该养成指定列名的习惯,因此,如果表结构发生更改,代码仍能工作。
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;
LOCK TABLES a WRITE;
INSERT INTO a VALUES (1,23),(2,34),(4,33);
INSERT INTO a VALUES (8,26),(6,29);
/* ... */
UNLOCK TABLES;