关于
django查询,我有一个与性能相关的问题.
假设我有一张拥有10,000条记录的员工表.现在,如果我想选择5名年龄大于或等于20岁的随机员工,那么就说5,500名员工年龄在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查询的外观来看,数据库首先返回5,500条记录,然后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_by(‘?’)将等于ORDER BY RAND(),甚至是[:5]语句在mysql中翻译为LIMIT(这里是doc和doc).