[英]Django: how do you deal with queries that can not scale?
在我的代碼中,我有一些根本無法擴展的查詢。
例如,看下面的代碼:
class OrderQuerySet(query.QuerySet):
def for_day(self, day: date):
""" Return all orders that concerns the given service day """
day_order_pks = [order.pk for order in self.all()
if localdate(order.service.start) == day]
return self.filter(pk__in=day_order_pks)
剛開始時,它運行良好。 問題是,當訂單數量增加時,性能似乎呈線性下降,這是有道理的,因為每次都需要測試所有訂單。 每天有1000個新訂單,很明顯,我的系統將在短時間內無法使用!
通常,您如何在Django中處理此類問題?
我的意思是,有時我可以找到一個技巧,僅使用Django ORM編寫更好的查詢。 但是有時候,為了得到我想要的東西,我似乎不得不使用Python和for循環以這種方式創建查詢集。
除非絕對必要,否則請不要列舉.all()
。 在數據庫端進行過濾更有效。 給定localdate(..)
並不會做很多事情,除了從datetime
提取日期外,您可以使用以下方法進行過濾:
class OrderQuerySet(query.QuerySet):
def for_day(self, day: date):
""" Return all orders that concerns the given service day """
return self.filter(service__start__date=day)
如果localdate(..)
更高級,您仍然可以嘗試在數據庫端完成大部分工作。 例如,通過將查詢集過濾為給定date
24小時內的訂單,然后在Python / Django端進行高級過濾。 但是,這樣做的想法是在數據庫端盡可能多地執行操作(除非您進行一些在數據庫中無法很好擴展的奇異查詢,但這很少見)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.