2011-08-05 26 views
0

我有蟒蛇以下SQLAlchemy的迭代:爲什麼我的兩個SQL迭代不同?

for business in session.query(Business).filter(Business.name.like("%" + term + "%")): 
    print business.name 

我有大約7000商家在我的名單,而這個運行在10毫秒以下。大!
但是,我想支持比特定更具體的搜索算法 - 例如,我想匹配&和,等等。所以,我試過如下:

for business in session.query(Business): 
    if term in business.name: 
     print business.name 

後者大約需要600毫秒運行。什麼是SQLAlchemy在它的過濾器調用中做的迭代更快?我怎樣才能讓我的速度更快?

謝謝!

回答

0

SA無法優化您的查詢。
你有不同的是間:對RDBMS

  1. 濾波數據直接一方面和
  2. 負載從數據庫到存儲器中的所有行,然後過濾掉那些不需要的。

顯然,第二個版本會慢得多,特別是如果行數很大。實際上,SA甚至可能會導致您的第二個版本變慢,因爲它會爲數據庫中的每一行創建Business對象,這取決於您的模型可能是相對昂貴的操作。此外,如果您有急切的關係,它也會加載這些關係。只要運行以下兩個查詢與數據庫直接看看有多少行,每行的回報:

SELECT * FROM Business WHERE Name LIKE '%term%'; 
SELECT * FROM Business; 

我會建議使用SQL引擎的過濾能力爲大量的對象,你可以更有效地完成大部分過濾直接有多大

+0

謝謝!你能建議這樣的過濾能力嗎?我正在使用SQLite,但MySQL也是一個選項 – Raiders

+0

@Raiders。我不是說任何特殊的過濾功能,而是一個'WHERE'語句。真正的區別在於,在這種情況下,您只能從數據庫加載一些數據行併爲它們創建Python對象,而在當前設置中,您從表中加載** ALL **行,爲它們創建Python對象,然後丟棄一些;除了花費更多時間,這些物體仍然留在記憶中。 – van

相關問題