Treci la conținut

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ă:

PHP
$docs->indexes()
    ->field('slug')->unique()
    ->field('kind')
    ->field('publishedAt')->range()
    ->sync();

Tipuri de indexuri:

  • indexuri de egalitate pentru câmpuri precum kind sau status: 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 ca put() 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 și prefix

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.

PHP
$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.