Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django objects.filter,how";“昂贵的”;会是这样吗?_Python_Sql_Django_Search_Optimization - Fatal编程技术网

Python Django objects.filter,how";“昂贵的”;会是这样吗?

Python Django objects.filter,how";“昂贵的”;会是这样吗?,python,sql,django,search,optimization,Python,Sql,Django,Search,Optimization,我正在尝试在Django中创建搜索视图。这是一个搜索表单,带有自由文本输入+一些选项可供选择,以便您可以根据年份等进行筛选。这是到目前为止我在视图中看到的一些代码,执行过滤的部分。我想了解一下这在数据库服务器上的开销 soknad_list=soknad.objects.all() 因此,我要做的是,首先列出所有对象,然后检查存在哪些变量(我在前面的一点上使用GET获取这些变量),然后过滤结果(如果存在)。但这似乎不太优雅,它可能会进行大量查询以获得结果,所以有更好的方法吗 这正是我想要的,

我正在尝试在Django中创建搜索视图。这是一个搜索表单,带有自由文本输入+一些选项可供选择,以便您可以根据年份等进行筛选。这是到目前为止我在视图中看到的一些代码,执行过滤的部分。我想了解一下这在数据库服务器上的开销


soknad_list=soknad.objects.all()

因此,我要做的是,首先列出所有对象,然后检查存在哪些变量(我在前面的一点上使用GET获取这些变量),然后过滤结果(如果存在)。但这似乎不太优雅,它可能会进行大量查询以获得结果,所以有更好的方法吗


这正是我想要的,但我想有一个更好/更聪明的方法来做到这一点。有什么想法吗?

过滤器本身不执行查询,只有从查询(例如get)中显式获取项,列表(查询)才会执行查询。

过滤器本身不执行查询,只有从查询(例如get)和列表(查询)中显式获取项,才会执行查询也执行它。

您可以看到将使用以下命令生成的查询:

soknad_list.query.as_sql()[0]

然后,您可以将其放入数据库外壳以查看查询需要多长时间,或者使用EXPLAIN(如果您的数据库后端支持)查看查询的开销。

您可以使用以下命令查看将生成的查询:

soknad_list.query.as_sql()[0]

然后,您可以将其放入数据库shell中,以查看查询需要多长时间,或者使用EXPLAIN(如果您的数据库后端支持它)查看它的开销。

正如Aaron所提到的,您应该掌握将针对数据库运行的查询文本,并使用EXPLAIN(或其他一些方法)查看查询执行计划。一旦掌握了查询的执行计划,就可以看到数据库本身发生了什么。对于任何数据库来说,运行过程代码都是非常琐碎的,特别是如果您提供了数据库可以用来加速查询的索引,那么有很多操作的运行成本非常高

如果我没有看错您的问题,那么您正在检索Soknad表中所有行的结果集。返回这些结果后,您可以使用filter()方法对符合条件的结果进行精简。从Django文档来看,这将执行内存中的筛选,而不是重新查询数据库(当然,这实际上取决于您使用的是哪个数据访问层,而不是Django本身)

最理想的解决方案是使用全文搜索引擎(Lucene、ferret等)为您处理此问题。如果这不可用或不实用,下一个最佳选择是在向数据库发出查询之前构造查询谓词(WHERE子句),并让数据库执行过滤


然而,与所有涉及数据库的事情一样,真正的答案是“视情况而定”。最好的建议是使用接近生产的数据尝试几种不同的方法,并在确定问题的最终解决方案之前至少在3次迭代中对其进行基准测试。在内存中进行筛选可能与在数据库中进行筛选一样快,甚至更快。

正如Aaron所提到的,您应该掌握将针对数据库运行的查询文本,并使用解释(或其他某种方法)查看查询执行计划。一旦掌握了查询的执行计划,就可以看到数据库本身发生了什么。对于任何数据库来说,运行过程代码都是非常琐碎的,特别是如果您提供了数据库可以用来加速查询的索引,那么有很多操作的运行成本非常高

如果我没有看错您的问题,那么您正在检索Soknad表中所有行的结果集。返回这些结果后,您可以使用filter()方法对符合条件的结果进行精简。从Django文档来看,这将执行内存中的筛选,而不是重新查询数据库(当然,这实际上取决于您使用的是哪个数据访问层,而不是Django本身)

最理想的解决方案是使用全文搜索引擎(Lucene、ferret等)为您处理此问题。如果这不可用或不实用,下一个最佳选择是在向数据库发出查询之前构造查询谓词(WHERE子句),并让数据库执行过滤


然而,与所有涉及数据库的事情一样,真正的答案是“视情况而定”。最好的建议是使用接近生产的数据尝试几种不同的方法,并在确定问题的最终解决方案之前至少在3次迭代中对其进行基准测试。在内存中进行筛选可能与在数据库中进行筛选一样快,甚至更快。

Ok,那么如果这是真的,它在执行视图之前不会查询数据库?所以当我实际查询数据库时,它已经被过滤掉了?因为一开始我有点担心Soknad.objects.all()带来的开销。是的,这是正确的。Django QuerySet是惰性的,在实际访问结果行(通过切片或迭代)之前不会执行。因此,代码中唯一潜在的性能问题是由最终(单个)数据库查询生成的SQL。啊哈,感谢Carl提供的信息,这很好,只要最终生成的查询是好的,不管这可能不是好的,都是好的。我担心我首先做了一个查询,得到了所有的对象,然后进行了过滤,然后做了一个新的查询,等等,这不是很好:)好吧,如果这是真的,那么在视图执行之前它不会查询数据库?所以当我实际查询数据库时,它已经被过滤掉了?因为我有点害怕会带来的开销