縮短

2012-09-06 36 views
1

我做不同的查詢像這樣在軌長期SQL日誌條目:縮短

Offer.where("id IN (?) AND foo = ?", offer_ids, 'bar') 

其中offer_ids進行計算,並具有約1.000 ID的長度。

這些造成很長的條目到development.log,如:

Offer Load (12.9ms) SELECT `offers`.* FROM `offers` WHERE (id IN (156439476,162525730,169378363,197193532,209583012,212783238,236381946,260584008,267542041,140892256,154059101,157130091,158223924,161242255,161410617,169374703,184305303,187582050,234519939,235460328,252011721,253958427,257583669,260506433,262371001,262925076,265363980,266580943,268164854,271348458,272595168,272965063,141293866,162515580,195738185,210118609,210183244,210783954,212896682,219931290,224907551,225764370,227558502,234479337,234536939,236329414,238409428,241871979,245480324,245491111,245507734,253281480,254462074,257921737,265282309,265542934,266584572,267530034,268798204,271548316,272761011,272899348,273012205,119125136,134552742,166766466,169187658,213728958,213732981,225761919,234827176,247156634,247196151,247214973,247659810,259275332,261664338,262780711,267516898,267741935,270442768,271445586,271630463,272560287,272643405,272957626,106364954,205619149,213425974,213731373,243644164,266104747,266428301,266947751,268013142,126413832,157986541,175322047,204080600,205821543,205821564,205830753,205848558,207430869,207442535,207458847,207952331,208122137,213731142,217001805,226506891,228735112,243682190,257949941,265512977,265908636,268833366,269372138,270447643,271237573,59037247,59169923,662 ...) AND foo = 'bar') 

我這些日誌條目中真正感興趣的,而不是特定的ID,並通過這些長項滾動速度變慢我的優化。

是否有寶石或簡單的方法來減少日誌,MySQL的慢查詢日誌的方式做:我不知道任何方式更改日誌

Offer Load (12.9ms) SELECT `offers`.* FROM `offers` WHERE (id IN (?) AND foo = ?) 

回答

2

。但是,如果您使用的是最新版本的rails,則可以使用子查詢,這可能是防止長時間記錄的一種方法。

例如,

如果您目前有:

offer_ids = @business.offers.map(&:id) # this is an array object 
Offer.where("id IN (?) AND foo = ?", offer_ids, 'bar') 

可以重構代碼:

offer_ids = @business.offers # this is an ActiveRelation object 
# offer_ids = @business.select(:id).offers # you can use this line instead of above line 

Offer.where(:id => offer_ids, :foo => 'bar') 

在這種情況下,你會得到這樣一個查詢:

SELECT `offers`.* FROM `offers` WHERE (id IN (SELECT id FROM `offers` WHERE business_id = 4) AND foo = 'bar') 

The不同之處在於您是否通過Array對象或ActiveRelation對象。

ActiveRelation對象是你得到什麼,當你使用一個查詢方法一樣whereselectlimit等,目前尚未執行查詢。在這種情況下,請注意不要使用諸如count,maximum,all或任何其他陣列方法(例如map,select)之類的方法,這將強制查詢運行,導致Array

+0

這一定會幫助我解決一些問題。一些id計算,我將不得不做的紅寶石,但其他人,這是一個很好的提示。謝謝! – Jan