我有一个关于 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 随机或我们选择的任何顺序对这些记录进行排序,并返回前五个记录的 block ,而原始查询将仅从数据库返回五个记录直接。
我的问题是这两个查询之间是否存在任何性能差异?如果是这样,哪个更好,为什么?
最佳答案
我快速检查了我现有的项目:
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)。
关于python - Django 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32534687/