Saltar al contenido

Índices

Los índices de DocStore se almacenan junto a la colección, en .storh/indexes. Son archivos normales, derivados por completo de los registros, y se pueden reconstruir en cualquier momento. Declárelos de forma fluida o mediante un esquema:

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

Tipos de índices:

  • Índices de igualdad para campos como kind o status: un archivo por cada valor distinto, de modo que una búsqueda puntual solo lee el archivo del valor correspondiente.
  • Índices únicos para campos como slug: la unicidad se comprueba al escribir; un valor duplicado hace que put() falle antes de escribir nada.
  • Índices de rango para valores escalares: un archivo ordenado con puntos de búsqueda dispersos, que admite gt, gte, lt, lte, between y prefix.

Los índices de rango también pueden responder a orderBy sobre el mismo campo con limit directamente en el orden del índice, ascendente o descendente, sin materializar ni ordenar todo el resultado.

Cuando una consulta combina dos predicados eq en campos indexados por igualdad no únicos, storh puede usar una cesta compuesta automática para ese par de campos. Así, los filtros selectivos de dos campos son rápidos sin tener que declarar otro índice.

Coherencia y reparación

Las escrituras actualizan las entradas del índice después de reemplazar atómicamente el archivo del registro, bajo el bloqueo de escritura de la colección, para que los registros y los índices se actualicen juntos. verify() compara cada índice con un recorrido completo de los registros e informa de las discrepancias; reindex() reconstruye todos los índices configurados a partir de los archivos de registros; repair() pone en cuarentena los registros dañados y luego los reconstruye.

PHP
$docs->reindex();

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

explain() devuelve index_scan cuando el planificador puede usar un índice configurado y full_scan en caso contrario.