2010-07-20 65 views
1

首先,我用這個請求:此更改如何影響此數據庫查詢的速度?

Model.object.get(name='something', date=somedatavariable) 

但後來我需要延長我的查詢,並更改爲這樣:

Model.objects.get(name__icontains="something", date__range(start_date,end_date)) 

突然我的數據庫需要比原始查詢的5倍。這裏發生了什麼,以及如何讓它更快?

回答

2

不區分大小寫的通配符搜索(name__icontains='something')肯定會比區分大小寫的精確匹配(name='something')更昂貴的DB查詢。較慢的5倍不健全,不合理,而且會有所不同很大程度上依賴於任何和所有的以下內容:

  • 數據庫引擎(MySQL和PostgreSQL,SQLite的,等)
  • 在DB的記錄數
  • 卷,它具有通過
  • 搜索無論是否有一個適當的索引數據庫可以使用該列

最後一個有非常棘手的每一個名字字段中的文本。爲數據庫做全文索引是非常困難的,很容易出錯,甚至沒有被所有的數據庫引擎支持。

datedate__range相同:您正在使用一個快速,簡單,易於索引的精確匹配,另一個使用了不精確的匹配。

底線:如果你不需要不完全匹配,那就不要使用它們。他們昂貴的數據庫操作,將花費更長的時間。

+0

也許我可以以某種方式重新配置MySQL數據庫。我不喜歡它的工作方式。我想很長時間。但在任務管理器中,它顯示MySQL僅使用25 MB。我可以爲MsSQL擴展我的內存嗎? – Pol 2010-07-20 21:24:59

+0

這不是內存問題。 MySQL的內存管理很好。您需要了解更多關於數據庫索引和排序規則如何工作的信息。或者爲了快速「我不想理解,只是給我一個解決方案...」然後我推薦這個谷歌搜索:http://www.google.com/search?q=django+mysql+full-text +索引 – 2010-07-20 21:37:31

+0

不!我想明白。給我一些好的文檔 – Pol 2010-07-21 00:04:20

0

我懷疑任何人都可以猜到,你的數據庫究竟如何表現:-)但你可以使用這個中間件:

http://djangosnippets.org/snippets/161/

和檢查,作了什麼樣的SQL查詢和多少時間,他們拿。

+0

確切地瞭解查詢花了多長時間是一件好事,雖然說實話我更喜歡在單元測試中進行這種分析,我可以分離變量。然而,這些查詢看起來相當簡單,OP的放緩的根源非常明顯。 – 2010-07-20 21:22:41