python - 如何在 django 中正确迭代一个巨大的查询集?

标签 python django django-queryset

我需要检索与某个复杂条件匹配的 5 个对象,并且我不能/不想将该条件传递给 WHERE 子句(django 中的过滤器),因此我需要迭代结果,进行测试每个记录的条件,直到我得到我的 5 个对象,之后我想扔掉查询集,再也不会看到它。

在大多数情况下,我需要的记录将位于查询集的开头,在最坏的情况下,它将位于查询集的末尾。表很大,我只需要 5 条记录。所以我的问题是:如何在没有 django 缓存结果的情况下迭代查询集?完成此操作时,sql 引擎/django 不得在任何地方存储/缓存结果。

最佳答案

为什么担心缓存?让 Django 或 mysql 做他们该做的事。

如果你下定决心的话。您可以禁用 Django 的缓存。在您的项目的 settings.py 中执行此操作非常简单。

对于 Mysql,您需要运行一些查询来禁用查询缓存 -

尝试在查询中使用SQL_NO_CACHE选项。就像这样

SELECT SQL_NO_CACHE * FROM TABLE

这将停止 MySQL 缓存结果,但请注意其他操作系统和磁盘缓存也可能会影响性能。这些更难绕过。

此方法的一个问题是它似乎只会阻止缓存查询结果。但是,如果您正在查询正在与要测试的查询一起使用的数据库,则其他客户端可能会缓存您的查询,从而影响您的结果。我正在继续研究解决这个问题的方法,如果我找到了,我将编辑这篇文章。

您还可以执行重置查询缓存

FLUSH QUERY CACHE

尽管需要注意的一点是,我建议让 Mysql 处理 WHERE 子句,因为它具有查询优化层,如果您索引了正确的字段,这将非常有效。获取所有结果并执行 WHERE 子句的操作可能会减慢速度,具体取决于查询集的大小。只是需要考虑一些事情。我想适当的基准测试应该为您指明方向。

关于python - 如何在 django 中正确迭代一个巨大的查询集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3893006/

相关文章:

mysql - 如何获取按匹配属性数量排序的查询行?

django - 如何在同一个查询中使用 __year 和 __in?

python - 使用先前值填充日期时间之间的重新采样间隙(多索引)

python - 一次更改 Pandas DataFrame 多列中的某些值

python - 在 django-rest-framework 中出现数据库验证错误后如何返回状态代码?

python 2.7 用户名的最小值和最大值

python - Django Forms - 如何使用前缀参数

django - 防止django admin转义html

python - 默认情况下,django 中有哪个 Web 服务器?

python - django 中模型 FK 关系的查询集