Django QuerySet 是不是使用二进制搜索按日期过滤?

Posted

技术标签:

【中文标题】Django QuerySet 是不是使用二进制搜索按日期过滤?【英文标题】:Does Django QuerySet use binary search to filter by date?Django QuerySet 是否使用二进制搜索按日期过滤? 【发布时间】:2015-11-01 19:55:39 【问题描述】:

我的 Django 应用程序中有一个使用简单历史记录 (https://github.com/treyhunner/django-simple-history) 的 Location 对象,我需要经常查询该对象以了解其在两个日期之间的历史记录。我知道你可以这样做:

Location.objects.filter(id=1, history_date__range=(starttime, endtime))

但是,我注意到给定 ID 的所有历史记录都是从最新到最早排序的。这意味着我应该能够对该列表进行二进制搜索以获取所有日期。

我的问题是——之后是否对 python 二进制搜索进行硬编码

Location.objects.filter(id=1)

比仅使用上述查询更快还是更慢?

【问题讨论】:

我不知道,但你试过计时吗? 我实际上并不知道它是如何工作的,但我敢打赌它会将实际实现放到您使用的任何数据库中。 我已经尝试过计时,但我认为我的历史还不够长,无法进行有意义的测量,因为它需要的时间大致相同。 (此时历史只有大约 3000 项,但随着时间的推移会变得更大)。 【参考方案1】:

这完全取决于您使用的数据库。在大多数数据库中,行的隐含“自然排序”:当行插入数据库时​​。这可能是它的显示方式,这并不能保证顺序。

如果您关心计算时间,可以在 history_date 上放置一个索引,因此获取有序列表是 O(log(n)) 时间。但是,插入、更新和删除的时间会稍微长一些!

【讨论】:

以上是关于Django QuerySet 是不是使用二进制搜索按日期过滤?的主要内容,如果未能解决你的问题,请参考以下文章

QuerySet 类型的对象不是 JSON 可序列化的 Django

QuerySet 不是 JSON 可序列化的 Django

Django开发博客系统(05-QuerySet的使用)

django queryset 返回“类名对象”而不是 DB 值

Django Queryset 过滤器检查相关对象是不是存在

Django queryset values_list 是不是返回一个列表对象?