Python Django查询性能
关于django查询,我有一个与性能相关的问题 假设我有一张有10000条记录的员工表。现在,如果我想随机选择5名年龄大于或等于20岁的员工,假设大约5500名员工年龄在20岁或以上。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
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()
,这是很棘手的。看看这个问题。