Django查询性能

Har*_*oon 5 python mysql sql-server django performance

我对Django查询有一个与性能相关的问题。

假设我有一张有10,000条记录的员工表。现在,如果我要选择5个年龄大于或等于20岁的随机雇员,那么可以说大约有5500名20岁或以上的雇员。django查询将是:

Employee.objects.filter(age__gte=20).order_by('?')[:5]
Run Code Online (Sandbox Code Playgroud)

并且该查询在mysql中的原始副本将是:

SELECT * FROM `database`.`employee` 
WHERE `employee`.`age` >= 20
ORDER BY RAND ()
LIMIT 5;
Run Code Online (Sandbox Code Playgroud)

从Django查询的外观看,数据库首先返回5500条记录,然后python以随机或我们选择的任何顺序对这些记录进行排序,并返回前五个记录的大块,而原始查询将仅直接从数据库返回五个记录。

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

Sha*_*ang 1

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

queryset = BlahModel.objects.order_by('?')[:5]
print queryset.query
Run Code Online (Sandbox Code Playgroud)

结果是:

SELECT `blah_model`.`id`, `blah_model`.`date` FROM `blah_model` ORDER BY RAND() LIMIT 5;
Run Code Online (Sandbox Code Playgroud)

所以,它们是相同的。

我对结果不会太惊讶,因为 django ORM 是 sql 查询结果和 django 对象之间的直接映射,所以order_by('?')等于ORDER BY RAND(),即使该[:5]语句被翻译为LIMITmysql (这里是docdoc)。