Index
Les index DocStore sont stockés à côté de la collection, sous .storh/indexes. Ce sont des fichiers ordinaires, entièrement dérivés des enregistrements, qui peuvent être reconstruits à tout moment. Déclarez-les de manière fluide ou dans un schéma :
$docs->indexes()
->field('slug')->unique()
->field('kind')
->field('publishedAt')->range()
->sync();
Types d’index :
- Index d’égalité pour des champs comme
kindoustatus: un fichier par valeur distincte, afin qu’une recherche ponctuelle ne lise que le fichier correspondant à la valeur. - Index uniques pour des champs comme
slug: l’unicité est imposée à l’écriture ; une valeur en double déclencheput()avant toute écriture. - Index de plage pour les valeurs scalaires : un fichier trié avec des points de repère de recherche clairsemés, permettant les opérations
gt,gte,lt,lte,betweenetprefix.
Les index de plage peuvent aussi répondre aux requêtes orderBy sur le même champ avec limit directement à partir de l’ordre de l’index, croissant ou décroissant, sans matérialiser ni trier l’ensemble des résultats.
Lorsqu’une requête combine deux prédicats eq sur des champs indexés par égalité non uniques, storh peut utiliser automatiquement un compartiment composé pour cette paire de champs. Les filtres sélectifs sur deux champs restent ainsi rapides sans nécessiter de déclaration d’index supplémentaire.
Cohérence et réparation
Les index sont mis à jour après le remplacement atomique du fichier d’enregistrement, sous le verrou en écriture de la collection, afin que les enregistrements et les index évoluent ensemble. verify() compare chaque index à un parcours complet des enregistrements et signale les écarts ; reindex() reconstruit chaque index configuré à partir des fichiers d’enregistrement ; repair() met en quarantaine les enregistrements corrompus, puis lance la reconstruction.
$docs->reindex();
$plan = $docs
->query()
->where('slug')->eq('home')
->explain();
explain() renvoie index_scan lorsque le planificateur peut utiliser un index configuré, et full_scan dans le cas contraire.