django查询优化-何时使用sql和何时使用python

django查询优化-何时使用sql和何时使用python,python,sql,django,query-optimization,Python,Sql,Django,Query Optimization,我正在寻找一条关于何时重新查询数据库更快,何时使用python从缓存中提取数据更快的一般经验法则 让我们假设我需要同时从数据库中提取两个东西:所有比萨饼和一个pk=5的特定比萨饼 更优化的是: pizzas = Pizza.objects.all() specific_pizza = Piazza.objects.get(pk=5) 或 当然,这取决于数据库。例如,如果pizza有1000万行,很明显,重新查询sql更好;如果pizza有10行,即使字段被索引,python也可能更快 谁

我正在寻找一条关于何时重新查询数据库更快,何时使用python从缓存中提取数据更快的一般经验法则

让我们假设我需要同时从数据库中提取两个东西:所有比萨饼和一个pk=5的特定比萨饼

更优化的是:

pizzas = Pizza.objects.all()   
specific_pizza = Piazza.objects.get(pk=5)

当然,这取决于数据库。例如,如果pizza有1000万行,很明显,重新查询sql更好;如果pizza有10行,即使字段被索引,python也可能更快


谁能帮助在中档范围内更优化?例如,比萨饼有数百行吗?数千行?

这个问题没有明确的答案——正如您所说,这取决于数据库(可能还有它的位置、表的数量和大小……)。您必须在特定的环境中进行测试

除了原始速度外,使用第一个版本还有一些重要的优点:

  • 它更短更清晰
  • ORM确切地知道您想要什么,因此任何进一步的优化都可以在该级别进行,而不是将它们推送到您的应用程序中
  • 它避免了在web服务器中进行(潜在的)密集计算
此外,还有一些值得思考的问题:如果您的表足够小,以至于python比DB快,那么速度是否重要


您可能想阅读有关过早优化的文章

这个问题没有明确的答案-正如您所说,这取决于数据库(可能还取决于数据库的位置、表的数量和大小……)。您必须在特定的环境中进行测试

除了原始速度外,使用第一个版本还有一些重要的优点:

  • 它更短更清晰
  • ORM确切地知道您想要什么,因此任何进一步的优化都可以在该级别进行,而不是将它们推送到您的应用程序中
  • 它避免了在web服务器中进行(潜在的)密集计算
此外,还有一些值得思考的问题:如果您的表足够小,以至于python比DB快,那么速度是否重要


您可能想阅读有关过早优化的文章

这个问题没有明确的答案-正如您所说,这取决于数据库(可能还取决于数据库的位置、表的数量和大小……)。您必须在特定的环境中进行测试

除了原始速度外,使用第一个版本还有一些重要的优点:

  • 它更短更清晰
  • ORM确切地知道您想要什么,因此任何进一步的优化都可以在该级别进行,而不是将它们推送到您的应用程序中
  • 它避免了在web服务器中进行(潜在的)密集计算
此外,还有一些值得思考的问题:如果您的表足够小,以至于python比DB快,那么速度是否重要


您可能想阅读有关过早优化的文章

这个问题没有明确的答案-正如您所说,这取决于数据库(可能还取决于数据库的位置、表的数量和大小……)。您必须在特定的环境中进行测试

除了原始速度外,使用第一个版本还有一些重要的优点:

  • 它更短更清晰
  • ORM确切地知道您想要什么,因此任何进一步的优化都可以在该级别进行,而不是将它们推送到您的应用程序中
  • 它避免了在web服务器中进行(潜在的)密集计算
此外,还有一些值得思考的问题:如果您的表足够小,以至于python比DB快,那么速度是否重要

您可能想阅读有关过早优化的文章

例如,如果比萨饼有1000万排,很明显 重新查询sql更好,如果Pizza是10行,即使 字段被索引,python可能更快

嗯。。。第一句话:是的。第二句话:不确定,但也不重要。 因为当只有很少的比萨饼时,neighter命令会花费很长时间

有谁能帮助在中等范围内更优化?

我想这与您的预期不一样,但是是的:因为我们同意当有很多比萨饼时使用
.get()
会更快,而且我们看到性能只是当有很多比萨饼时的一个问题,考虑到未来比萨饼的数量可能会增加,我想我们可以同意使用
.get()
是正确的做法

撇开性能不谈——它显然更具可读性,所以你真的应该走这条路

另外,请注意,您可以使用
QuerySet
.all()
返回
QuerySet
!)上的方法来过滤所需内容。其工作原理是“幕后的魔法”——因此,假设在找到与该假设相反的证据之前,会进行优化。所以你应该使用这些方法,直到你达到一个真正需要目标优化的点。如果你达到了这一点,你就可以进行基准测试并得到一个可靠的答案

例如,如果比萨饼有1000万排,很明显 重新查询sql更好,如果Pizza是10行,即使 字段被索引,python可能更快

嗯。。。第一句话:是的。第二句话:不确定,但也不重要。 因为当只有很少的比萨饼时,neighter命令会花费很长时间

有谁能帮助在中等范围内更优化?

我想这与您的预期不一样,但是是的:因为我们同意当有很多比萨饼时使用
.get()
会更快,而且我们看到性能只是当有很多比萨饼时的一个问题,考虑到未来比萨饼的数量可能会增加,我想我们可以同意使用
.get()
是正确的做法

撇开性能不谈——它显然更具可读性,所以你真的很喜欢它
pizzas = Pizza.objects.all()
for pizza in pizzas:
    if pizza.pk == 5
        specific_pizza = pizza
        break 
pizzas = Pizza.objects.all()
for pizza in pizzas:
    if pizza.pk == 500
        specific_pizza = pizza
        break 
mushroom_pizzas=[pizza for pizza in pizzas if pizza.topping==Pizza.MUSHROOM]