Индекси
DocStore индексите се съхраняват до колекцията в .storh/indexes. Те са обикновени файлове, изведени изцяло от записите, и могат да бъдат изградени отново по всяко време. Декларирайте ги с верижен интерфейс или чрез схема:
$docs->indexes()
->field('slug')->unique()
->field('kind')
->field('publishedAt')->range()
->sync();
Видове индекси:
- индекси за равенство за полета като
kindилиstatus: по един файл за всяка различна стойност, така че директното търсене чете само файла със съответната стойност - уникални индекси за полета като
slug: проверяват се при запис; дублирана стойност води до неуспешенput(), преди да бъде записано каквото и да е - индекси за диапазон за скаларни стойности: сортиран файл с разредени контролни точки за търсене, който обслужва
gt,gte,lt,lte,betweenиprefix
Индексите за диапазон могат също да обслужват orderBy по същото поле чрез limit, директно в реда на индекса, възходящ или низходящ, без да събират и сортират целия резултат в паметта.
Когато заявка комбинира два предиката eq върху неуникални полета с индекс за равенство, storh може автоматично да използва съставен сегмент за тази двойка полета. Така филтрите по две полета със селективни стойности остават бързи, без да е нужно да се декларира друг индекс.
Съгласуваност и поправка
Записите в индексите се актуализират след атомарната подмяна на файла със записа, под заключване за запис на колекцията, така че записите и индексите се променят заедно. verify() сравнява всеки индекс с пълно сканиране на записите и отчита несъответствия; reindex() изгражда отново всички зададени индекси от файловете със записи; repair() поставя повредените записи под карантина и след това изгражда индексите отново.
$docs->reindex();
$plan = $docs
->query()
->where('slug')->eq('home')
->explain();
explain() връща index_scan, когато планировчикът може да използва зададен индекс, а иначе връща full_scan.