Indexuri
DocStore indexurile sunt stocate lângă colecție, în .storh/indexes.
Sunt fișiere obișnuite, derivate integral din înregistrări și pot fi
reconstruite oricând. Declarați-le prin API-ul fluent sau printr-o
schemă:
$docs->indexes()
->field('slug')->unique()
->field('kind')
->field('publishedAt')->range()
->sync();
Tipuri de indexuri:
- indexuri de egalitate pentru câmpuri precum
kindsaustatus: un fișier pentru fiecare valoare distinctă, astfel încât o căutare punctuală citește doar fișierul valorii potrivite - indexuri unice pentru câmpuri precum
slug: unicitatea este impusă la scriere, iar o valoare duplicată face caput()să eșueze înainte de a se scrie ceva - indexuri de interval pentru valori scalare: un fișier sortat cu puncte sparse de salt, care oferă
gt,gte,lt,lte,betweenșiprefix
Indexurile de interval pot răspunde și la orderBy asupra aceluiași câmp cu un limit
direct din ordinea indexului, crescător sau descrescător, fără materializarea și
sortarea întregului rezultat.
Când o interogare combină două predicate eq pe câmpuri indexate pentru egalitate, dar ne-unice,
storh poate folosi automat un bucket compus pentru perechea de câmpuri. Astfel, filtrele selective pe două câmpuri rămân rapide fără să fie nevoie de declararea unui alt index.
Consistență și reparare
Scrierile actualizează intrările indexului după înlocuirea atomică a fișierului de înregistrare,
sub blocarea de scriere a colecției, astfel încât înregistrările și indexurile se modifică împreună.
verify() compară fiecare index cu o scanare completă a înregistrărilor și raportează diferențele;
reindex() reconstruiește fiecare index configurat din fișierele de înregistrări; repair()
pune în carantină înregistrările corupte, apoi reconstruiește indexurile.
$docs->reindex();
$plan = $docs
->query()
->where('slug')->eq('home')
->explain();
explain() returnează index_scan când planificatorul poate folosi un index configurat și full_scan în caz contrar.