MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

In MongoDB, sto usando una query di grandi dimensioni, come creerò un indice composto o un singolo indice, quindi il mio tempo di risposta aumenta

In generale, vorrai inserire un indice sui campi più utilizzati come criteri di filtro nelle tue query più importanti/frequenti, iniziando per primi dai campi più selettivi. C'è una discreta guida sull'argomento come parte della documentazione di MongoDB . Un'affermazione di particolare interesse per il tuo caso è probabilmente questa poiché hai molti $or s:

La cosa più importante qui, tuttavia, è misurare, misurare, misurare ed esaminare i piani di esecuzione delle query utilizzando explain() . Il motivo è che molto probabilmente avrai diversi tipi di query che la tua applicazione deve supportare e dovrai fare un compromesso a un certo punto in cui dovrai scegliere tra i costi di manutenzione dell'indice (ad es. Blocchi di scrittura durante gli aggiornamenti dell'indice e i requisiti di spazio su disco) e la soluzione teoricamente più veloce in cui tutti i campi utilizzati in una singola query sono coperti da un unico indice.

L'intero argomento di indicizzazione è un po' confuso che dipende fortemente dal tuo scenario preciso:

  • I tuoi dati sono molto aggiornati e le scritture devono essere super veloci (vorrai indici inferiori/più piccoli) o i tuoi dati sono abbastanza stabili con letture frequenti che devono essere veloci (vai con indici più/grandi)?
  • Che tipo di domande devi supportare? Quanto sono simili in termini di filtri? Alcune combinazioni di filtri saranno più probabili di altre? Quali query devono funzionare bene, quali possono essere un po' più lente?
  • Come vengono distribuiti i dati nei tuoi campi potenzialmente indicizzati?
  • e così via...

Non troverai il singolo indice che aiuta tutte le tue query a funzionare al meglio. Inoltre, quando si aggiungono più indici o si modificano quelli esistenti, ciò può far sì che Query Optimizer smetta di utilizzare alcuni indici per alcune query e scelga invece un piano di esecuzione diverso che può essere desiderato o meno. Quindi misura tutto ciò che è importante su qualsiasi modifica all'indicizzazione o al layout fisico dei dati (configurazione hardware, partizionamento orizzontale...). Infine, dovresti misurare regolarmente le prestazioni della tua query man mano che la tua quantità di dati aumenta, a meno che non sia prevedibilmente uniforme nella sua distribuzione.

Per farla breve:scegli un approccio iterativo e inizia aggiungendo un indice (suggerirei di aggiungerne uno su isBlockedByAdmin , isDelete e information.shares.userId ) quindi misura le prestazioni della query e perfeziona l'indice in base ai risultati (e ancora, e ancora, ...).