2011-05-09 92 views
5

我對MySQL使用sqlalchemy(表達式語言,不是完整的ORM),並且遇到了一些意外的緩慢。特別是,通過sqlalchemy執行select查詢花費的時間是從mysql命令行執行相同查詢所耗費的時間的十倍。從CPROFILE分析SQL查詢

輸出:

ncalls tottime percall cumtime percall filename:lineno(function) 
100 206.703 2.067 206.703 2.067 {method 'query' of '_mysql.connection' objects} 

MySQL的時間:0.26秒

的共識似乎是,有一些開銷使用SQLAlchemy的,但幾乎沒有這麼多。任何有關可能導致這種行爲的建議?

的查詢是通常的形式:爲緩慢

SELECT fieldnames.minage, fieldnames.maxage, fieldnames.race,  
fieldnames.sex, sum(pop.population) AS pop, pop.zip5 
FROM pop 
INNER JOIN fieldnames ON fieldnames.fieldname = pop.fieldname_id 
WHERE fieldnames.race IN ("White alone") 
AND fieldnames.sex IN ("Female") 
AND fieldnames.maxage >=101 
AND fieldnames.minage <=107 
GROUP BY fieldnames.minage, fieldnames.maxage 
+0

確保在sqlalchemy運行之後,您不直接在MySQL中運行查詢,否則結果將存在於查詢緩存中。如果內存提供服務,RESET QUERY CACHE會清除所有內容。通過sql鍊金術不應該有太大的區別。 – SteveMc 2011-05-09 19:11:36

+0

我在發佈問題後想過緩存。我打算清除緩存,但初步結果表明這不是問題。 – AAmeliorant 2011-05-09 20:20:11

+0

網絡問題 - 如果您是從本地運行MySQL而不是應用程序的遠程運行,那可能會導致延遲,但它必須是大量數據和/或網絡速度較慢。分析信息幾乎排除了sqlalchemy可能做的任何事情。 – SteveMc 2011-05-10 15:20:25

回答

1

一個可能的原因 - 是否SQL鍊金術使用預處理語句?如果是,那麼您可能遇到性能差異的原因是因爲在創建兩個查詢計劃時,mysql優化器具有不同的信息。

當您從命令行運行查詢時,mysql優化器具有填充所有where子句值的完整查詢(如上面顯示的那樣),因此可以顯式優化這些值。

當從SQL鍊金術運行,MySQL優化可能只看到這個(也許fieldnames.race和fieldnames.sex的參數以及):

SELECT fieldnames.minage, fieldnames.maxage, fieldnames.race,  
fieldnames.sex, sum(pop.population) AS pop, pop.zip5 
FROM pop 
INNER JOIN fieldnames ON fieldnames.fieldname = pop.fieldname_id 
WHERE fieldnames.race IN ("White alone") 
AND fieldnames.sex IN ("Female") 
AND fieldnames.maxage >= ? 
AND fieldnames.minage <= ? 
GROUP BY fieldnames.minage, fieldnames.maxage 

因此,優化器必須作出一個猜測是什麼你可能會使用的值然後圍繞它進行優化。不幸的是,這可能會產生一個錯誤的猜測,因此在最壞的情況下創建一個查詢計劃,使查詢運行速度遠遠超出您的預期。