自定义表上的大型查询 - 内存问题

Posted

技术标签:

【中文标题】自定义表上的大型查询 - 内存问题【英文标题】:Large query on a custom table - memory issue 【发布时间】:2018-12-05 04:41:21 【问题描述】:

我正在构建一个插件,用于创建可由用户兑换的代码。我需要在 WP_LIST_TABLE 中显示所有生成的代码。我创建了一个名为“bo_codes”的自定义表,它看起来像这样。

表:https://visual23.com/table.png

我的查询如下所示。

$query = "
SELECT $wpdb->bo_vaping_codes.bo_code, $wpdb->bo_vaping_codes.assigned_product_name, $wpdb->bo_vaping_codes.status, $wpdb->bo_vaping_codes.run_number, $wpdb->bo_vaping_codes.author_name, $wpdb->bo_vaping_codes.date_created
FROM $wpdb->bo_vaping_codes
ORDER BY $wpdb->bo_vaping_codes.date_created DESC;
";
$data = $wpdb->get_results( $query, ARRAY_A );

我做了一个测试并生成了 100,000 个代码,我得到了这个错误。 “致命错误:268435456字节的允许内存大小已用尽(试图分配72字节)”

我可以对数据库或查询做些什么来减少使用的内存?我不确定我做错了什么,还是我只是在挑战极限。

【问题讨论】:

没有用户想要查看包含 100k 项的列表。使用分页仅显示记录的子集。 好吧,一方面,您选择了整个表,因为没有“where”子句。很难指导您做什么,因为我不确定它是如何使用的。 @Shadow 此数据进入一个 WP_LIST_TABLE,一次显示 15 个项目并进行分页。似乎 WP_LIST_TABLE 仍然需要加载所有记录,然后进行自己的分页。 @Gerik 我没有添加 WHERE 子句,因为我实际上需要获取每一行。该数据用于在插件管理屏幕中填充 WP_LIST_TABLE。基本上它显示了所有生成的代码。谢谢! 您显示的那段代码没有任何分页。要么使用 insert ... select ... 填充有问题的表,要么在将所有内容插入目标表之前分页数据。 【参考方案1】:

这是一个 UI 设计问题,而不是数据库问题。

分页不合理——回到第一条评论:没有用户会想要查看 100k 项的列表。我会补充:“是否分页”。所以,重新思考 UI;决定在不提供所有信息的情况下展示有用信息的方式。

也许首先询问要为哪个“产品类别”列出项目。

也许是“作者”先写的。

也许它是在哪个月份“创建”的。

只要对应用有意义。但请确保分组不会导致出现过长的列表,然后一次性显示或分页。

对于 100K 项目,在到达实际列表之前经过 两个 级别的挑选可能是合理的。这样一来,一次可以挑选的东西最多可以减少到 100 件以内。

【讨论】:

你说的完全正确,我会回到该机构让他们重新考虑这一部分。 @RobbBennett - 是的;推回!太多的网站和设备让我很生气,因为他们的设计师没有考虑用户界面。

以上是关于自定义表上的大型查询 - 内存问题的主要内容,如果未能解决你的问题,请参考以下文章

优化大型表上的 SQL 连接

高效的 ORDER BY 与大型表上的依赖子查询

用于不适合内存的大型 hdf5 文件的 Keras 自定义数据生成器

在 Django 中的大表上的内存效率(常量)和速度优化迭代

自引用表上的 SQL 递归查询 (Oracle)

多对多数据透视表上的自定义范围