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:
$docs->indexes()
->field('slug')->unique()
->field('kind')
->field('publishedAt')->range()
->sync();
Typy indexů:
- indexy rovnosti pro pole jako
kindnebostatus: 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,betweenaprefix
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ří.
$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.