哪个插入查询 运行 更快更准确?
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');
哪个插入查询执行得更快?查询之间有什么区别?
我不确定纯数据库端方式哪个更快。但是,当您从 PHP 脚本调用数据库时,第二种方式应该更快,因为您可以在多次调用中节省资源。
总之。只有一种方法可以知道。测试一下。
TL;TR
第二次查询会更快。为什么?阅读下文...
基本上,一个查询是在不同的步骤中执行的:
- 连接:您的代码的两个版本都必须这样做
- 向服务器发送查询:适用于两个版本,只有第二个版本只发送一个查询
- 解析查询:同上,两个版本都需要解析查询,第二个版本只需要解析1个查询,但是
- 插入行:两种情况相同
- 插入索引:同样,两种情况都相同理论上。我希望 MySQL 在第二种情况下批量插入后构建更新索引,使其 可能 更快。
- 结束语:两种情况相同
当然,这并不能说明全部情况:Table 锁对性能有影响,MySQL 配置,使用准备好的语句和事务可能会导致更好(或更糟) ) 性能也是如此。当然,数据库服务器的设置方式也会有所不同。
所以我们 return 遵循古老的口头禅:
如有疑问:测试!
根据您的测试结果,您可能想要更改一些配置,然后再次测试,直到找到最佳配置。
在大数据集的情况下,理想的折衷方案可能是两个版本的组合:
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:
If you are inserting many rows from the same client at the same time, use INSERT statements with multiple VALUES lists to insert several rows at a time. This is considerably faster (many times faster in some cases) than using separate single-row INSERT statements. If you are adding data to a nonempty table, you can tune the bulk_insert_buffer_size variable to make data insertion even faster. See Section 5.1.4, “Server System Variables”.
如果您不能使用多个值,那么锁定也是一种加快插入速度的简单方法,如同一页所述:
To speed up INSERT operations that are performed with multiple statements for nontransactional tables, lock your 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;
This benefits performance because the index buffer is flushed to disk only once, after all INSERT statements have completed. Normally, there would be as many index buffer flushes as there are INSERT statements. Explicit locking statements are not needed if you can insert all rows with a single INSERT.
通读整个页面以了解详细信息
我必须将数据插入 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');
哪个插入查询执行得更快?查询之间有什么区别?
我不确定纯数据库端方式哪个更快。但是,当您从 PHP 脚本调用数据库时,第二种方式应该更快,因为您可以在多次调用中节省资源。
总之。只有一种方法可以知道。测试一下。
TL;TR
第二次查询会更快。为什么?阅读下文...
基本上,一个查询是在不同的步骤中执行的:
- 连接:您的代码的两个版本都必须这样做
- 向服务器发送查询:适用于两个版本,只有第二个版本只发送一个查询
- 解析查询:同上,两个版本都需要解析查询,第二个版本只需要解析1个查询,但是
- 插入行:两种情况相同
- 插入索引:同样,两种情况都相同理论上。我希望 MySQL 在第二种情况下批量插入后构建更新索引,使其 可能 更快。
- 结束语:两种情况相同
当然,这并不能说明全部情况:Table 锁对性能有影响,MySQL 配置,使用准备好的语句和事务可能会导致更好(或更糟) ) 性能也是如此。当然,数据库服务器的设置方式也会有所不同。
所以我们 return 遵循古老的口头禅:
如有疑问:测试!
根据您的测试结果,您可能想要更改一些配置,然后再次测试,直到找到最佳配置。
在大数据集的情况下,理想的折衷方案可能是两个版本的组合:
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:
If you are inserting many rows from the same client at the same time, use INSERT statements with multiple VALUES lists to insert several rows at a time. This is considerably faster (many times faster in some cases) than using separate single-row INSERT statements. If you are adding data to a nonempty table, you can tune the bulk_insert_buffer_size variable to make data insertion even faster. See Section 5.1.4, “Server System Variables”.
如果您不能使用多个值,那么锁定也是一种加快插入速度的简单方法,如同一页所述:
To speed up INSERT operations that are performed with multiple statements for nontransactional tables, lock your 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;
This benefits performance because the index buffer is flushed to disk only once, after all INSERT statements have completed. Normally, there would be as many index buffer flushes as there are INSERT statements. Explicit locking statements are not needed if you can insert all rows with a single INSERT.
通读整个页面以了解详细信息