get_results on large datasets

时间:2012-06-08 作者:Kaaviar

我正在使用自定义SQL查询来试验一些非常令人不安的问题。我有一个自定义MySQL表,名为trading_datas 4.4Mo有165条管线。一个字段datas 我的表是一个大的序列化数组。

以这种方式请求时:

$querystr = "SELECT item, datas FROM trading_datas";
$result = $wpdb->get_results( $querystr, \'ARRAY_A\' );
我的PHP脚本停止了,在那一行之后没有任何内容得到响应。仅检索时item 一切都很好。

在将序列化数组放入数据库之前,是否应该先压缩它?还有其他解决方案吗?

非常感谢您的帮助!

1 个回复
最合适的回答,由SO网友:Eugene Manuilov 整理而成

$wpdb 不适合从数据库中获取大量数据。为什么?在您的情况下:

  1. $wpdb->get_results( ... ) - 立即将所有结果提取到RAM中。这意味着,如果数据库中有4mb、10mb或50mb的数据,所有内容都将存储在内存中(正如您所知,内存是有限的)
  2. $wpdb->get_results( ..., ARRAY_A ) - $wpdb 默认情况下,将所有内容作为对象获取,如果传递ARRAY_A, 它将对象数组转换为关联数组数组。这意味着如果你已经4mb/10mb/50mb 如果要将数据存储到内存中,则必须将其乘以2倍甚至更多倍mysql_* 以您需要的方式发挥作用:

    $result = @mysql_query( "SELECT item, datas FROM trading_datas", $wpdb->dbh );
    if ( $result ) {
        while ( ( $row = @mysql_fetch_array( $result, MYSQL_ASSOC ) ) ) {
            // do stuff here for each result ...
        }
        @mysql_free_result( $result );
    }
    

结束