Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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查询性能_Python_Mysql_Sql Server_Django_Performance - Fatal编程技术网

Python Django查询性能

Python Django查询性能,python,mysql,sql-server,django,performance,Python,Mysql,Sql Server,Django,Performance,关于django查询,我有一个与性能相关的问题 假设我有一张有10000条记录的员工表。现在,如果我想随机选择5名年龄大于或等于20岁的员工,假设大约5500名员工年龄在20岁或以上。django查询将是: Employee.objects.filter(age__gte=20).order_by('?')[:5] mysql中此查询的原始对应项为: SELECT * FROM `database`.`employee` WHERE `employee`.`age` >= 20 ORD

关于django查询,我有一个与性能相关的问题

假设我有一张有10000条记录的员工表。现在,如果我想随机选择5名年龄大于或等于20岁的员工,假设大约5500名员工年龄在20岁或以上。django查询将是:

Employee.objects.filter(age__gte=20).order_by('?')[:5]
mysql中此查询的原始对应项为:

SELECT * FROM `database`.`employee` 
WHERE `employee`.`age` >= 20
ORDER BY RAND ()
LIMIT 5;
从django查询的外观来看,数据库首先返回5500条记录,然后python按照随机顺序或我们选择的任何顺序对这些记录进行排序,并返回前五条记录的块,而原始查询将直接从数据库返回五条记录


我的问题是,这两个查询之间是否存在性能差异?如果是这样,哪一个更好?为什么?

我快速检查了我现有的项目:

queryset = BlahModel.objects.order_by('?')[:5]
print queryset.query
结果是:

SELECT `blah_model`.`id`, `blah_model`.`date` FROM `blah_model` ORDER BY RAND() LIMIT 5;
所以,它们是一样的


我不会对结果感到太惊讶,因为django ORM是sql查询结果和django对象之间的直接映射,因此,
order\u by('?')
将等于
order by RAND()
,甚至在mysql中,
[:5]
语句也被转换为
LIMIT
(这是and)

您看到的任何性能问题都不是因为django。正如尚旺所指出的,Django执行的查询与原始查询完全相同。问题在于rand()调用

正如在其他地方所解释的,包括一些StackOveflow的答案,例如:问题是因为必须为每一行计算一个随机值。幸运的是,您有一个WHERE子句可以减少行数。但随着数据的增长,您的查询将逐渐变得越来越慢


关于如何克服这个问题,这个链接有几个不同的建议

好问题-我不知道!看看这个答案,你应该能够应用他们建议的步骤来找出答案。嘿,很抱歉!要避免为每一行调用
RAND()
,这是很棘手的。看看这个问题。