首先,我用這個請求:此更改如何影響此數據庫查詢的速度?
Model.object.get(name='something', date=somedatavariable)
但後來我需要延長我的查詢,並更改爲這樣:
Model.objects.get(name__icontains="something", date__range(start_date,end_date))
突然我的數據庫需要比原始查詢的5倍。這裏發生了什麼,以及如何讓它更快?
首先,我用這個請求:此更改如何影響此數據庫查詢的速度?
Model.object.get(name='something', date=somedatavariable)
但後來我需要延長我的查詢,並更改爲這樣:
Model.objects.get(name__icontains="something", date__range(start_date,end_date))
突然我的數據庫需要比原始查詢的5倍。這裏發生了什麼,以及如何讓它更快?
不區分大小寫的通配符搜索(name__icontains='something'
)肯定會比區分大小寫的精確匹配(name='something'
)更昂貴的DB查詢。較慢的5倍不健全,不合理,而且會有所不同很大程度上依賴於任何和所有的以下內容:
最後一個有非常棘手的每一個名字字段中的文本。爲數據庫做全文索引是非常困難的,很容易出錯,甚至沒有被所有的數據庫引擎支持。
date
與date__range
相同:您正在使用一個快速,簡單,易於索引的精確匹配,另一個使用了不精確的匹配。
底線:如果你不需要不完全匹配,那就不要使用它們。他們昂貴的數據庫操作,將花費更長的時間。
我懷疑任何人都可以猜到,你的數據庫究竟如何表現:-)但你可以使用這個中間件:
http://djangosnippets.org/snippets/161/
和檢查,作了什麼樣的SQL查詢和多少時間,他們拿。
確切地瞭解查詢花了多長時間是一件好事,雖然說實話我更喜歡在單元測試中進行這種分析,我可以分離變量。然而,這些查詢看起來相當簡單,OP的放緩的根源非常明顯。 – 2010-07-20 21:22:41
也許我可以以某種方式重新配置MySQL數據庫。我不喜歡它的工作方式。我想很長時間。但在任務管理器中,它顯示MySQL僅使用25 MB。我可以爲MsSQL擴展我的內存嗎? – Pol 2010-07-20 21:24:59
這不是內存問題。 MySQL的內存管理很好。您需要了解更多關於數據庫索引和排序規則如何工作的信息。或者爲了快速「我不想理解,只是給我一個解決方案...」然後我推薦這個谷歌搜索:http://www.google.com/search?q=django+mysql+full-text +索引 – 2010-07-20 21:37:31
不!我想明白。給我一些好的文檔 – Pol 2010-07-21 00:04:20