我正在将csv文件导入到mysql数据库。还没有研究过批量插入,但是想知道通过循环这些值来构造一个大规模的INSERT语句(使用PHP)会更有效吗?或者单独插入CSV行效率更高?构建一个大规模的插入语句或许多插入语句会更高效吗?
3
A
回答
1
这是很难给出一个答案不知道至少有两个以上的元素:
1)您的数据库在PHP代码运行在同一台服务器上运行?
2)文件的大小是多少?即平均20 csv记录? 200? 20000?
在一般情况下,循环播放csv文件并为每行启动插入语句(请使用prepared statements,或者DB每次花费时间解析相同的字符串)将是更传统的方法,除非在PHP和数据库之间有一个非常缓慢的连接,否则要足够高效。
即使在这种情况下,如果csv文件超过20条记录长度,您可能会从SQL解析器开始遇到最大语句长度问题。
3
我不知道PHP如何与mySQL建立连接的细节,但是每个插入请求都会有一些超出插入数据的开销。因此我会想象一个批量插入比重复的数据库调用要有效得多。
4
批量插入要快得多。我通常会做这样的事情,一次导入100条记录(100条记录的批量大小是任意的)。
$a_query_inserts = array();
$i_progress = 0;
foreach($results as $a_row) {
$i_progress++;
$a_query_inserts[] = "({$a_row['Column1']}, {$a_row['Column2']}, {$a_row['Column3']})";
if(count($a_query_inserts) > 100 || $i_progress >= $results->rowCount()) {
$s_query = sprintf("INSERT INTO Table
(Column1,
Column2,
Column3)
VALUES
%s",
implode(', ', $a_query_inserts)
);
db::getInstance()->query($s_query);
// Reset batch
$a_query_inserts = array();
}
}
还有一种方法可以直接将load the file导入数据库。
相关问题
- 1. 高效的插入语句
- 2. 单插入语句插入多个值
- 3. 插入语句和更新语句包
- 4. 插入语句
- 5. 插入语句
- 6. MySQL插入语句不会插入?
- 7. MySQL语句不会插入
- 8. SQLite异常:插入语句不会返回一个语句
- 9. 一次使用一个插入语句插入多个记录
- 10. 多条插入语句
- 11. 使用Excel构建插入语句
- 12. SQL插入语句
- 13. PostgreSQL插入语句
- 14. CakePHP插入语句
- 15. 插入语句2005
- 16. 插入语句cx_Oracle
- 17. sql插入语句语法
- 18. MySQL插入语句语法?
- 19. 一个巨大的SQL语句或许多小型SQL语句?
- 20. 如何提高许多插入语句的速度?
- 21. 使单个插入语句
- 22. sqlite中的多个插入语句android
- 23. SQL语句插入语句为空?
- 24. 插入语句中的多个Select语句
- 25. 将mysql插入语句转换为sql server插入语句?
- 26. MySQL插入语句(插入到表(列)选择语句)
- 27. InfiniDB插入语句的插入速度
- 28. 将SQL插入语句编写到另一个插入语句中
- 29. hibernate批量插入仍然会生成很多插入语句
- 30. 插入和更新在单个语句
我一直在使用一次插入多达2000行的语句成功。实际上,没有“max语句长度”这样的事物,只有[max_allowed_packet](http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet) my.cnf中的指令直接限制语句长度。 – cypher 2011-06-10 13:06:43
决定使用具有多个插入的准备好的语句。运作良好。试用了10K行的CSV。 – samxli 2011-06-12 16:32:23