2015-06-18 14 views
5

Ho una definizione di indice grande che impiega troppo tempo per indicizzare. Ho il sospetto che il problema principale sia causato dai molti JOINT OUTER SINISTRO generati.Prestazioni di indicizzazione di Thinking Sphinx

Ho visto this question ma non riesco a trovare la documentazione sull'uso di source: :query, che sembra essere parte della soluzione.

La mia definizione di indice e la query risultante può essere trovato qui: https://gist.github.com/jonsgold/fdd7660bf8bc98897612

Come posso ottimizzare la query generato di funzionare più velocemente durante l'indicizzazione?

risposta

2

La soluzione "standard" di sfinge sarebbe utilizzare query a distanza.

http://sphinxsearch.com/docs/current.html#ex-ranged-queries

... frazionamento la query in un sacco di piccole parti, in modo che il server di database ha una migliore possibilità di essere in grado di eseguire la query (piuttosto che uno enorme di query)

Ma io non ho idea di come abilitarlo abilmente in Thinking Sphinx. Non riesci a vedere nulla nella documentazione. Potrebbe aiutarti a modificare lo sphinx.conf, ma anche a non sapere in che modo TS gestirà la modifica manuale del file di configurazione.

+0

Grazie, sembra un buon punto di partenza. – Jonathan

+0

Sembra che i campi uniti possano risolvere meglio il mio problema di indicizzazione delle prestazioni: http://sphinxsearch.com/docs/current.html#conf-sql-joined-field. Qualche idea su come implementarlo in TS? – Jonathan

+0

Guardando più da vicino l'avviso di stato ora ha già raggiunto la query, hai modificato l'essenza? Se non dispiace, non l'ho notato. Anche i campi uniti sono utili, scusa non so se TS può abilitarne l'uso. – barryhunter

0

Questa è la soluzione che ha funzionato meglio (dal linked question). Fondamentalmente, è possibile rimuovere un pezzo della query principale sql_query e definirlo separatamente come sql_joined_field nel file sphinx.conf.

È importante aggiungere tutte le condizioni sql pertinenti a ogni sql_joined_field (come gli indici di sharding per modulo sull'ID). Ecco la nuova definizione:

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 

La magia che definisce il campo site come una query separata è l'opzione source: :query alla fine della linea.

Si noti che la definizione dell'indice di base ha il parametro delta?: false, mentre la definizione dell'indice delta ha il parametro delta?: true. È così che potrei usare la condizione WHERE incidents.delta = 1 nell'indice delta e filtrare i record non pertinenti.

Ho trovato che lo sharding non ha funzionato meglio, quindi sono tornato a un indice unificato.

Vedere l'intera definizione dell'indice qui: https://gist.github.com/jonsgold/05e2aea640320ee9d8b2.

Importante da ricordare!

L'offset ID documento Sfinge deve essere gestito manualmente. Cioè, ogni volta che viene aggiunto o rimosso un indice per un altro modello, il mio ID documento calcolato cambierà. Questo deve essere aggiornato.

Così, nel mio esempio, se ho aggiunto un indice per un modello diverso (non :incident), avrei dovuto correre rake ts:configure per scoprire il mio nuovo offset e modificare incidents.id * 51 + 7 conseguenza.