我需要检索与某个复杂条件匹配的 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/