我有一個很長的索引定義,索引太長。我懷疑主要問題是由許多生成的左外部聯接引起的。思考獅身人面像索引性能
我看到this question,但無法找到有關使用source: :query
的文檔,這似乎是解決方案的一部分。
我的索引定義和生成的查詢可以在這裏找到:https://gist.github.com/jonsgold/fdd7660bf8bc98897612
如何優化生成的查詢索引來時跑得更快?
我有一個很長的索引定義,索引太長。我懷疑主要問題是由許多生成的左外部聯接引起的。思考獅身人面像索引性能
我看到this question,但無法找到有關使用source: :query
的文檔,這似乎是解決方案的一部分。
我的索引定義和生成的查詢可以在這裏找到:https://gist.github.com/jonsgold/fdd7660bf8bc98897612
如何優化生成的查詢索引來時跑得更快?
對此的'標準'獅身人面像解決方案將使用範圍查詢。
http://sphinxsearch.com/docs/current.html#ex-ranged-queries
...分裂查詢到大量的小零件,所以數據庫服務器具有能夠運行查詢(而不是一個巨大的查詢)
但我有更好的機會不知道如何在思維獅身人面像中實現這一點。在文檔中看不到任何內容。可以幫助你編輯sphinx.conf,但也不知道TS如何處理你手動編輯配置文件。
這是最好的解決方案(從linked question)。基本上,您可以刪除一條主要查詢sql_query
,並在sphinx.conf
文件中將其單獨定義爲sql_joined_field
。
將所有相關的sql條件添加到每個sql_joined_field
(例如通過在模塊上對模塊進行分片索引)很重要。這裏的新定義:
ThinkingSphinx::Index.define(
:incident,
with: :active_record,
delta?: false,
delta_processor: ThinkingSphinx::Deltas.processor_for(ThinkingSphinx::Deltas::ResqueDelta)
) do
indexes "SELECT incidents.id * 51 + 7 AS id, sites.name AS site FROM incidents LEFT OUTER JOIN sites ON sites.id = site_id WHERE incidents.deleted = 0 AND EXISTS (SELECT id FROM accounts WHERE accounts.status = 'enabled' AND incidents.account_id = id) ORDER BY id", as: :site, source: :query
...
has
...
end
ThinkingSphinx::Index.define(
:incident,
with: :active_record,
delta?: true,
delta_processor: ThinkingSphinx::Deltas.processor_for(ThinkingSphinx::Deltas::ResqueDelta)
) do
indexes "SELECT incidents.id * 51 + 7 AS id, sites.name AS site FROM incidents LEFT OUTER JOIN sites ON sites.id = site_id WHERE incidents.deleted = 0 AND incidents.delta = 1 AND EXISTS (SELECT id FROM accounts WHERE accounts.status = 'enabled' AND incidents.account_id = id) ORDER BY id", as: :site, source: :query
...
has
...
end
,場site
定義爲一個單獨的查詢是在該行的末尾選項source: :query
神奇。
注意,核心索引定義具有參數delta?: false
,而增量索引定義具有參數delta?: true
。這樣我就可以在增量索引中使用WHERE incidents.delta = 1
條件並過濾掉不相關的記錄。
我發現分片並沒有更好的表現,所以我恢復了一個統一的索引。
查看整個索引定義在這裏:https://gist.github.com/jonsgold/05e2aea640320ee9d8b2。
重要的是要記住!
Sphinx文檔ID偏移量必須手動處理。也就是說,無論何時添加或刪除另一個模型的索引,我的計算文檔ID都會改變。這必須更新。因此,在我的例子中,如果我爲一個不同的模型(而不是:incident
)添加了一個索引,我將不得不運行rake ts:configure
來找出我的新偏移量並相應地更改incidents.id * 51 + 7
。
謝謝,這聽起來像是一個很好的開始。 – Jonathan
似乎加入的字段會更好地解決索引性能問題:http://sphinxsearch.com/docs/current.html#conf-sql-joined-field。任何想法如何在TS中實現? – Jonathan
仔細看看現在已經有查詢的要點,你是否編輯了要點?如果沒有抱歉沒有注意到。加入的字段也很有用,抱歉不知道TS是否可以啓用它們。 – barryhunter