خانه/ ایندکس‌گذاری و کارایی/ ایندکس غیرخوشه‌ای

ایندکس غیرخوشه‌ای: یک فهرست جدا برای جست‌وجوی سریع

متوسط ۱۳ دقیقه مطالعه

در درس قبل دیدیم ایندکس خوشه‌ای، ترتیب فیزیکی خودِ جدول را مشخص می‌کند و هر جدول فقط یکی از آن دارد. اما اگر بخواهی جست‌وجوی سریع روی ستون دیگری هم داشته باشی — مثلاً city به‌جای id — چه؟ این‌جا نوبت ایندکس غیرخوشه‌ای (Non-Clustered Index) است: یک ساختار جداگانه شبیه فهرست انتهای کتاب — مقدار ستون را به‌همراه یک اشاره‌گر به محل واقعی ردیف نگه می‌دارد، بدون این‌که ترتیب فیزیکی خودِ جدول را تغییر دهد.

بدون ایندکس: جست‌وجوی خطی

وقتی روی ستونی که ایندکس ندارد فیلتر می‌کنی، موتور پایگاه‌داده مجبور است همه‌ی ردیف‌ها را یکی‌یکی بررسی کند (به این کار Table Scan می‌گویند). بیا خودمان ببینیم:

امتحانش کن — قبل از ساخت ایندکس
نتیجه SCAN students است — یعنی موتور مجبور شد همه‌ی ردیف‌های جدول را یکی‌یکی بخواند تا شهرهای «تهران» را پیدا کند. برای ۶ ردیف بی‌اهمیت است، اما برای یک میلیون ردیف، فاجعه‌ی کارایی است.

حالا یک ایندکس غیرخوشه‌ای می‌سازیم

sql
CREATE INDEX idx_students_city ON students(city);

این دستور در SQLite و SQL Server تقریباً یکسان است. بیا اثرش را روی همان پرس‌وجو ببینیم:

امتحانش کن — بعد از ساخت ایندکس
حالا نتیجه SEARCH students USING INDEX idx_students_city (city=?) است — موتور مستقیم به ردیف‌های شهر «تهران» پرید، بدون بررسی بقیه‌ی ردیف‌ها. روی جدول‌های بزرگ، تفاوت می‌تواند از چند دقیقه به چند میلی‌ثانیه برسد.

Bookmark Lookup: هزینه‌ی پنهانِ ایندکس غیرخوشه‌ای

نکته‌ی مهم: ایندکس غیرخوشه‌ای فقط مقدار ستون ایندکس‌شده و یک اشاره‌گر را نگه می‌دارد — نه کل ردیف. پس اگر پرس‌وجو به ستون‌های دیگری هم نیاز داشته باشد که در ایندکس نیستند، SQL Server باید یک قدم اضافه («Key Lookup» یا «Bookmark Lookup») بردارد تا از ایندکس به جدول اصلی برگردد و بقیه‌ی ستون‌ها را بخواند.

راه‌حل: Covering Index

اگر همه‌ی ستون‌هایی که پرس‌وجو نیاز دارد، در خودِ ایندکس موجود باشند، دیگر نیازی به آن قدم اضافه نیست — به این حالت Covering Index می‌گویند. بیا خودمان با یک مثال ساده در همین Playground ببینیم:

امتحانش کن — این یکی Covering Index است
امتحانش کن — این یکی Non-Covering است
جعبه‌ی اول USING COVERING INDEX را نشان می‌دهد — چون grade، هم ستون فیلترشده و هم ستون خروجی است، کل پرس‌وجو از خودِ ایندکس جواب داده می‌شود. جعبه‌ی دوم فقط USING INDEX است (بدون کلمه‌ی Covering) — چون full_name در ایندکس نیست و باید یک قدم اضافه به جدول اصلی برداشته شود. در SQL Server، این ایده با CREATE INDEX ... INCLUDE (full_name) پیاده‌سازی می‌شود: ستون‌های اضافه را بدون این‌که بخشی از کلید جست‌وجو باشند، به برگ‌های ایندکس اضافه می‌کنی.

جمع‌بندی این درس

  • ایندکس غیرخوشه‌ای، ساختار جداگانه‌ای است که مقدار ستون و اشاره‌گر به ردیف اصلی را نگه می‌دارد.
  • برخلاف ایندکس خوشه‌ای، هر جدول می‌تواند چندین ایندکس غیرخوشه‌ای داشته باشد.
  • بدون ایندکس مناسب، موتور پایگاه‌داده مجبور به Table Scan (بررسی همه‌ی ردیف‌ها) می‌شود.
  • Covering Index یعنی همه‌ی ستون‌های موردنیاز پرس‌وجو در خودِ ایندکس موجودند — بدون نیاز به برگشت به جدول اصلی.

در درس بعدی، ایندکس روی چند ستون هم‌زمان (ایندکس ترکیبی) را یاد می‌گیریم — و یک قانون مهم به نام «Leftmost Prefix» که تعیین می‌کند این ایندکس کِی واقعاً استفاده می‌شود.