Django-ORM数据库查询性能(例:count与len的比较)

  • count()与len()性能比较
    Django-ORM查询queryset数据集是惰性查询的,只有使用到数据集时,ORM才会真正去执行查询语句,然后ORM会把查询到的数据集缓存到内存中,下次我们使用数据集时是从缓存中取值的。

    • 1.如果queryset数据集被使用然后缓存,我们使用queryset对象结果集count()时其底层源码如下图是用len()计算结果集长度的,所以在此场景有缓存的情况下用len()和count()来计算查询结果集的效果是一样的;
    • 2.如果只想获得queryset数据的长度而不做其他操作,count()底层实现用的是数据库的聚合函数查询计算结果,然后取其结果时间复杂度是O(1),空间复杂度为O(1),而len()底层实现是是需要获取整个queryset数据集时间复杂度为O(n),并且空间复杂度也为O(n),这种情况下使用count()更好;
    • 3.如果既要计算queryset数据集的长度,又要对queryset数据集做其他操作(如获取每个queryset对象的属性等),使用len()计算长度时会比count()会更有优势,因为此时少了一次对数据的聚合查询操作。
    • 4.如果对还未使用的queryset数据集,使用len()或者count()来计算结果集的长度,然后使用分页组件对数据集进行分页处理,最后使用我们分页后的结果集。此场景需要考虑以下几个因素:
      • (1)如果此时我们使用的是len()的话我们会缓存整个queryset结果集,并相当于遍历了整个结果集时间复杂度为O(n),空间复杂度为O(n),分页操作对于我们后端的时间或者空间来说都没什么太大帮助了;
      • (2)如果此时我们使用的是count()来计算长度的话,我们会多一次数据库查询操作&
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值