当前位置:  开发笔记 > 编程语言 > 正文

如何在PHP中构建大型MySQL INSERT查询而不浪费内存

如何解决《如何在PHP中构建大型MySQLINSERT查询而不浪费内存》经验,为你挑选了1个好方法。

我的代码看起来像这样:

$data = file_get_contents($tempFile); // perhaps 30MB of file data, now in PHP's memory
$hash = md5($data);
$query = "INSERT INTO some_table
          SET BlobData = '" . mysql_real_escape_string($data) . "',
          BlobHash = '$hash'
          ";
mysql_query($query);

我知道每个''都不是很有效率.运算符将重新分配更大的内存块,30MB字符串将被复制多次.

有没有比以下解决方案更有效的方法?

$data = file_get_contents($tempFile); // perhaps 30MB of file data, now in PHP's memory
$hash = md5($data);
$query = "INSERT INTO some_table SET BlobData = '%s', BlobHash = '$hash'";
mysql_query(sprintf($query, mysql_real_escape_string($data)));

joelhardi.. 7

你有两个问题:

#1,有几种不同的方法可以计算MD5哈希值:

像你一样做,并作为字符串加载到PHP并使用PHP md5()

使用PHP md5_file()

从PHP 5.1+开始,您可以将PHP的流API与其中任何一个一起使用,md5或者md5_file避免将其完全加载到内存中

使用exec()调用系统md5sum命令

使用MySQL的MD5()函数来计算哈希值

由于这些都很容易实现,因此您可以轻松地实现所有内存使用和速度并对其进行基准测试.以下是一些基准测试,显示系统md5 via execmd5_file文件大小增加时快得多.就内存使用而言,按照自己的方式进行绝对是最糟糕的方式.

#2 mysql_real_escape_string执行数据库查询,因此您实际上将blob数据传输到数据库,将其作为字符串返回,然后使用INSERT查询再次传输(!).所以它往返于DB服务器3x而不是1x,并且在PHP中使用2x内存.

使用PHP5预处理语句并将此数据仅发送到数据库一次会更有效.阅读链接的文章部分,您会看到它提到在绑定参数时,您可以使用blob类型将blob数据以块的形式传输到数据库.在PHP的文档mysqli_stmt::send_long_data有这一点,插入一个文件到BLOB列,就像你是一个伟大的简单的例子.

通过这样做,并使用流API md5_fileexec系统md5命令,您可以完成整个INSERT,而无需将整个文件加载到内存中,这意味着您的一系列操作的内存使用量可以低至您想要的!



1> joelhardi..:

你有两个问题:

#1,有几种不同的方法可以计算MD5哈希值:

像你一样做,并作为字符串加载到PHP并使用PHP md5()

使用PHP md5_file()

从PHP 5.1+开始,您可以将PHP的流API与其中任何一个一起使用,md5或者md5_file避免将其完全加载到内存中

使用exec()调用系统md5sum命令

使用MySQL的MD5()函数来计算哈希值

由于这些都很容易实现,因此您可以轻松地实现所有内存使用和速度并对其进行基准测试.以下是一些基准测试,显示系统md5 via execmd5_file文件大小增加时快得多.就内存使用而言,按照自己的方式进行绝对是最糟糕的方式.

#2 mysql_real_escape_string执行数据库查询,因此您实际上将blob数据传输到数据库,将其作为字符串返回,然后使用INSERT查询再次传输(!).所以它往返于DB服务器3x而不是1x,并且在PHP中使用2x内存.

使用PHP5预处理语句并将此数据仅发送到数据库一次会更有效.阅读链接的文章部分,您会看到它提到在绑定参数时,您可以使用blob类型将blob数据以块的形式传输到数据库.在PHP的文档mysqli_stmt::send_long_data有这一点,插入一个文件到BLOB列,就像你是一个伟大的简单的例子.

通过这样做,并使用流API md5_fileexec系统md5命令,您可以完成整个INSERT,而无需将整个文件加载到内存中,这意味着您的一系列操作的内存使用量可以低至您想要的!

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有