Přejít k obsahu

Indexy

DocStore se ukládají vedle kolekce v .storh/indexes. Jde o běžné soubory odvozené výhradně ze záznamů, které lze kdykoli znovu vytvořit. Deklarujte je plynule nebo pomocí schématu:

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

Typy indexů:

  • indexy rovnosti pro pole jako kind nebo status: jeden soubor pro každou jedinečnou hodnotu, takže vyhledávání konkrétní hodnoty čte jen příslušný soubor
  • jedinečné indexy pro pole jako slug: jedinečnost se vynucuje při zápisu a duplicitní hodnota vyvolá put() ještě před jakýmkoli zápisem
  • rozsahové indexy pro skalární hodnoty: seřazený soubor s řídkými body pro přístup, který obsluhuje gt, gte, lt, lte, between a prefix

Rozsahové indexy mohou pro stejné pole také přímo z pořadí indexu zodpovídat orderBy s řazením limit, vzestupně nebo sestupně, aniž by bylo nutné načíst a seřadit celou sadu výsledků.

Když dotaz kombinuje dva predikáty eq nad poli s indexem rovnosti, který není jedinečný, může storh pro danou dvojici polí použít automatický složený blok. Díky tomu jsou selektivní filtry se dvěma poli rychlé, aniž by bylo třeba deklarovat další index.

Konzistence a opravy

Zápisy aktualizují položky indexu po atomickém nahrazení souboru záznamu pod zámkem pro zápis na úrovni kolekce, takže záznamy a indexy zůstávají konzistentní. verify() porovnává každý index s úplným skenováním záznamů a hlásí nesoulad; reindex() znovu vytvoří všechny nakonfigurované indexy ze souborů záznamů; repair() přesune poškozené záznamy do karantény a poté indexy znovu vytvoří.

PHP
$docs->reindex();

$plan = $docs
    ->query()
    ->where('slug')->eq('home')
    ->explain();

explain() vrací index_scan, pokud plánovač může použít nakonfigurovaný index, a jinak full_scan.