Indeks
DocStore indeks disimpan di samping koleksi dalam .storh/indexes. Indeks ini berupa file biasa, sepenuhnya diturunkan dari catatan, dan dapat dibangun ulang kapan saja. Deklarasikan secara fluent atau melalui skema:
$docs->indexes()
->field('slug')->unique()
->field('kind')
->field('publishedAt')->range()
->sync();
Jenis indeks:
- indeks kesetaraan untuk kolom seperti
kindataustatus: satu file untuk setiap nilai unik, sehingga pencarian langsung hanya membaca file nilai yang cocok - indeks unik untuk kolom seperti
slug: diterapkan saat penulisan; nilai duplikat akan menggagalkanput()sebelum apa pun ditulis - indeks rentang untuk nilai skalar: file terurut dengan checkpoint pencarian sparse, yang melayani
gt,gte,lt,lte,between, danprefix
Indeks rentang juga dapat menjawab orderBy pada kolom yang sama dengan limit langsung dari urutan indeks, menaik atau menurun, tanpa mematerialisasi dan mengurutkan seluruh hasil.
Saat kueri menggabungkan dua kondisi eq pada kolom berindeks kesetaraan non-unik, storh dapat menggunakan bucket gabungan otomatis untuk pasangan kolom tersebut. Ini mempercepat filter dua kolom yang selektif tanpa memerlukan deklarasi indeks tambahan.
Konsistensi dan perbaikan
Penulisan memperbarui entri indeks setelah file catatan diganti secara atomik, di bawah lock tulis koleksi, sehingga catatan dan indeks bergerak bersama. verify() membandingkan setiap indeks dengan pemindaian catatan lengkap dan melaporkan ketidaksesuaian; reindex() membangun ulang setiap indeks yang dikonfigurasi dari file catatan; repair() mengarantina catatan yang rusak lalu membangun ulang indeks.
$docs->reindex();
$plan = $docs
->query()
->where('slug')->eq('home')
->explain();
explain() mengembalikan index_scan ketika planner dapat menggunakan indeks yang dikonfigurasi dan full_scan jika tidak.