0

我偶然发现了一些关于 PHP 的有趣的记忆事情考虑这段代码(sql-result 大约是 18000 行)

echo memory_get_usage() . PHP_EOL;

echo 'Querying mysql' . PHP_EOL;
$result = $wpdb->get_results($sql);

echo memory_get_usage() . PHP_EOL;

echo PHP_EOL;
echo 'Size of result set' . PHP_EOL;
echo strlen(serialize($result)) . PHP_EOL;

输出:

33309232
Querying mysql
86203976

Size of result set
6838278

为什么内存使用高峰会这样?是不是有点奇怪?

也许最重要的问题是,我能做些什么来降低使用率吗?

4

2 回答 2

0

数据库的每一行都被打包成一个对象/散列,每个值都有一个散列键和值本身,所以这会产生很多开销。

你可以做些什么来减少开销:1)确保只选择你真正需要的列,不要只做select *

2) get_results()有第二个参数,用于控制返回的内容。如果你使用ARRAY_N,你会得到数组数组的结果,这应该有最小的开销。

wpdb#SELECT_Generic_Results

3)如果这还不够,您需要分批获取数据,例如1000行。offset您可以为此使用 sql 修饰符limit

于 2012-06-14T11:06:40.917 回答
0

只有使用 xdebug 进行基本分析才能查明实际内存使用情况。

没有分析,大胆猜测,你有多种选择:

  • 对结果进行分页,即发送多个查询而不是一个大查询
  • 使用ARRAY_N作为$wpdb->get_results($sql, ARRAY_N)更轻更紧凑格式的输出格式

奖励(如 Meier 所说):检查您是否需要 SELECT 子句中的每个字段,并且没有select *

希望这可以帮助 !

于 2012-06-14T11:27:25.847 回答