python - Django 查询性能

标签 python mysql sql-server django performance

我有一个关于 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(这里是 docdoc)。

关于python - Django 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32534687/

相关文章:

python - 如何检查列表是否包含 bool 值

php - Ajax 和 PHP : MySQL Query Not Fetching Any Rows

mysql - 重新排序用作排序子句的主键列

sql - 不明确的列名

python - Pandas 按某些列分组

python - 插入/并将 yymmdd 反转为 ddmmyy

sql - 如何重建/重新安装 ssrs(reportserver、reportservertempdb)数据库?

SQL Server - 将默认日期时间值分配给存储过程中的参数

python - Django 模型字段未出现在管理员中

php - 访问cake php中的复合表数据