Към съдържанието

Индекси

DocStore индексите се съхраняват до колекцията в .storh/indexes. Те са обикновени файлове, изведени изцяло от записите, и могат да бъдат изградени отново по всяко време. Декларирайте ги с верижен интерфейс или чрез схема:

PHP
$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() поставя повредените записи под карантина и след това изгражда индексите отново.

PHP
$docs->reindex();

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

explain() връща index_scan, когато планировчикът може да използва зададен индекс, а иначе връща full_scan.