2013-03-22 65 views
0

为了提高安全性,我实现了一个执行预准备语句的函数。当使用PHP准备好的语句和mysqli时,缓慢检索blob字段

但是当我尝试获取base64编码的blob内容(大约30-50KB)时,我遇到了问题。

如果我不使用预处理语句运行查询,它会很快运行。

通过准备好的声明,它在拨打电话时停止播放:mysqli_stmt_fetch($statement) 并且需要将近一分钟或更长时间才能运行,最终返回结果。

只要我摆脱mysqli_stmt_fetch($statement)调用或从我的select查询中排除blob字段,事情就像往常一样快速运行。

我希望有人知道这里发生了什么。到目前为止,我已经挖掘了互联网寻找答案,但运气不大。

+0

听起来像司机给我的错误。但首先是什么?也许你也可以提供两个不同查询的完整代码($ statement)。 – baloo 2013-03-22 21:25:07

+0

该应用使用api调用,该调用返回没有模式的数据。无模式数据填充到一个blob中。 – 2013-03-22 21:35:42

回答

1

我会将二进制blob保存在MySQL以外的其他内容中,在MySQL中保留一个简单的标识符,以便我知道该如何取回它。 MySQL不会是存储大块二进制数据的首选方式。
至少它会解决你的问题,你应该尝试抛弃base64的开销(这也增加了33%的大小)。

我想尝试的另一个解决方案是查看是否有更新版本的驱动程序或服务器。或者尝试使用不同的驱动程序,如PDO

第三种解决方案是尝试将字段类型从BLOB更改为TEXT,base64位于正常ascii范围内。

+0

我现在只是排除了斑点。但是很可能会再次遇到这个问题,所以我将不得不看到测试不同的驱动程序来看看会发生什么。我的部门中的许多程序员在MySQL中抛出了很多像这样的值(我知道这是一个糟糕的做法),因为他们无法访问像HDFS或其他高可用性数据存储的中央文件存储。所以,唉,我们现在已经陷入了一个角落。 – 2013-03-30 06:49:25