انتقل إلى المحتوى

الفهارس

تُخزَّن الفهارس 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 فيما عدا ذلك.