我偶然发现了一些关于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
为什么内存使用量会像这样达到峰值?是不是有点奇怪?
也许最重要的问题是,我可以做些什么来降低使用率?
数据库的每一行都打包到一个对象/哈希中,每个值都有一个哈希键和值本身,因此这会产生大量开销。
您可以采取哪些措施来减少开销:1)一定要只选择你真正需要的列,不要只做select *
2)get_results()
有第二个参数,你用它来控制你得到什么。如果使用 ARRAY_N
,则结果为数组数组,这应该具有最小的开销。
WPDB#SELECT_Generic_Results
3)如果这还不够,则需要批量获取数据,例如1000行。为此,您可以使用 sql 修饰符offset
和limit
。
只有使用 xdebug 进行基本分析才能查明实际内存使用情况。
没有分析,大胆猜测,你有多种选择:
- 对
- 结果进行分页,即发送多个查询而不是一个大的查询
- 使用ARRAY_N作为
$wpdb->get_results($sql, ARRAY_N)
,更轻,更紧凑格式的输出格式
奖金(如迈尔所说):检查您是否需要 SELECT 子句中的每个字段,并且没有select *
希望这有帮助!