Django QuerySet 是否使用二进制搜索按日期过滤?
Does Django QuerySet use binary search to filter by date?
我的 Django 应用程序中有一个使用简单历史记录 (https://github.com/treyhunner/django-simple-history) 的位置对象,我需要经常查询该对象两个日期之间的历史记录。我知道你可以这样做:
Location.objects.filter(id=1, history_date__range=(starttime, endtime))
但是,我注意到给定 ID 的所有历史记录都是从最新到最早排序的。这意味着我应该能够对该列表进行二进制搜索以获取包含的所有日期。
我的问题是——在
之后对python二进制搜索进行硬编码
Location.objects.filter(id=1)
比仅使用上述查询更快还是更慢?
这完全取决于您使用的数据库。在大多数数据库中,有一个隐式的 "natural ordering" 行:当行被插入到数据库中时。这可能是它的显示方式,但不能保证顺序。
如果您关心计算时间,您可以在 history_date 上放置一个索引,因此抓取一个有序列表是 O(log(n)) 时间。但是,插入、更新、删除的时间稍长!
我的 Django 应用程序中有一个使用简单历史记录 (https://github.com/treyhunner/django-simple-history) 的位置对象,我需要经常查询该对象两个日期之间的历史记录。我知道你可以这样做:
Location.objects.filter(id=1, history_date__range=(starttime, endtime))
但是,我注意到给定 ID 的所有历史记录都是从最新到最早排序的。这意味着我应该能够对该列表进行二进制搜索以获取包含的所有日期。
我的问题是——在
之后对python二进制搜索进行硬编码Location.objects.filter(id=1)
比仅使用上述查询更快还是更慢?
这完全取决于您使用的数据库。在大多数数据库中,有一个隐式的 "natural ordering" 行:当行被插入到数据库中时。这可能是它的显示方式,但不能保证顺序。
如果您关心计算时间,您可以在 history_date 上放置一个索引,因此抓取一个有序列表是 O(log(n)) 时间。但是,插入、更新、删除的时间稍长!