2010-12-14 4 views
12

Ciao per uno dei miei modelli foto che ho:binari - created_at quando utente per l'ordine, dovresti aggiungere un indice alla tabella?

default_scope :order => 'photos.created_at DESC, photos.version DESC' 

dato che io sto per ordinare da created_at e versione ... Dovrei avere un indice di DB created_at?

Grazie

+0

Sembra una buona pratica farlo. Ma forse non farà la differenza in termini di velocità, perché se ordinati per id sono (di solito) già ordinati, e Rails genera automaticamente un indice per id. –

risposta

6

Il seguente è basato sulla mia esperienza PostgreSQL, ma probabilmente anche applicare per MySQL e altri.

Se si prevede di recuperare un numero elevato di record da questa tabella o di utilizzare l'impaginazione, sarebbe utile un indice sui campi utilizzati nello ORDER BY.

È necessario creare un indice su tutti i campi dell'ordine nello stesso ordine. Se si mescola ASC e DESC nel proprio ORDER BY, sarà necessario creare un indice con questi ordini specifici per sfruttare al massimo l'indice.

Una migrazione ActiveRecord adatto per le tue foto tabella sarebbe:

add_index :photos, [:created_at, :version] 

mi sento di raccomandare a guardare il EXPLAIN ANALYZE di uscita con i dati di produzione simile prima e dopo l'aggiunta dell'indice per confermare che sta avendo l'effetto si è dopo.

9

Stavo solo leggendo su questa scorsa notte mentre aggiungevo indici a un certo numero di tabelle. La risposta breve è "sì". Il caso è abbastanza eloquente fatto qui:

http://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes

La risposta è più anche 'sì', ma perché non provarlo un po 'e vedere che tipo di chilometraggio si ottiene fuori di esso sulla base di quanto la tua app interagisce con i dati.

+0

Ottimo post. Parla non solo di SQL, ma anche di ActiveRecord. Tuttavia non puoi forzare l'uso di un particolare indice in PostgreSQL. Il che mi rende curioso di sapere come funzionano le cose in ActiveRecord 3 con istruzioni preparate, perché l'aumento di velocità che si ottiene con pg è evitando ogni volta l'analisi del piano. – m33lky

13

Un trucco che può essere utile: in tipici modelli MySql/ActiveRecord, si avrà id come chiave primaria numerica (quindi implicitamente indicizzato), che dovrebbe essere nello stesso ordine di created_at - che significa che si poteva ordinare da id invece e ottenere le prestazioni veloci, senza il costo di scrittura per un indice aggiuntivo.