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

ایندکس خوشه‌ای: وقتی خودِ جدول، ایندکس است

مبتدی ۱۲ دقیقه مطالعه

فرض کن یک دفترچه تلفن داری که نام افراد به ترتیب حروف الفبا چیده شده. برای پیداکردن «رضایی» دیگر لازم نیست صفحه‌به‌صفحه جلو بروی — می‌دانی وسط دفترچه را باز کنی. ایندکس خوشه‌ای (Clustered Index) دقیقاً همین کار را با داده‌های یک جدول می‌کند: ترتیب فیزیکی ذخیره‌سازی ردیف‌ها روی دیسک را برابر با ترتیب یک ستون (یا چند ستون) خاص می‌کند.

نکته‌ی کلیدی: فقط یکی در هر جدول

چون داده‌ها فقط می‌توانند به یک ترتیب فیزیکی روی دیسک چیده شوند (نه دو ترتیب هم‌زمان)، هر جدول در SQL Server حداکثر یک ایندکس خوشه‌ای می‌تواند داشته باشد. وقتی جدولی ایندکس خوشه‌ای ندارد، به آن «Heap» می‌گویند — ردیف‌ها بدون ترتیب مشخصی ذخیره می‌شوند.

به‌طور پیش‌فرض، وقتی یک PRIMARY KEY تعریف می‌کنی، SQL Server خودش یک ایندکس خوشه‌ای روی همان ستون می‌سازد (مگر صریحاً چیز دیگری بخواهی):

sql
CREATE TABLE students (
  id INT PRIMARY KEY, -- به‌طور پیش‌فرض، ایندکس خوشه‌ای همین‌جا ساخته می‌شود
  full_name NVARCHAR(100),
  city NVARCHAR(50)
);

معادل این مفهوم در SQLite: rowid

در SQLite (همین Playground)، هر جدول معمولی به‌طور پیش‌فرض یک ستون پنهان به نام rowid دارد که داده‌ها را به همان ترتیب فیزیکی ذخیره می‌کند — دقیقاً همان نقشی که ایندکس خوشه‌ای در SQL Server بازی می‌کند. وقتی ستونی را INTEGER PRIMARY KEY تعریف می‌کنی، آن ستون خودش دقیقاً همان rowid می‌شود (نه یک کپی جدا) — یعنی جست‌وجو روی آن، مستقیماً از ساختار فیزیکی جدول استفاده می‌کند. بیا با EXPLAIN QUERY PLAN ببینیمش:

امتحانش کن — جست‌وجو روی INTEGER PRIMARY KEY
نتیجه SEARCH students USING INTEGER PRIMARY KEY (rowid=?) را نشان می‌دهد — یعنی موتور پایگاه‌داده مستقیم به همان ردیف روی دیسک پرید، بدون بررسی ردیف‌به‌ردیف. این دقیقاً همان کاری‌ست که ایندکس خوشه‌ای در SQL Server هم انجام می‌دهد.

چرا انتخاب ستون ایندکس خوشه‌ای مهم است

چون داده‌ی کل جدول فیزیکاً بر اساس این ستون مرتب می‌شود، انتخاب بد می‌تواند هزینه‌بر باشد:

  • مقادیر ترتیبی و رو به رشد (مثل id خودافزا) گزینه‌ی خوبی‌اند: ردیف جدید همیشه در انتهای فایل اضافه می‌شود — بدون نیاز به جابه‌جایی داده‌های قبلی.
  • مقادیر تصادفی (مثل GUID یا کد ملی) گزینه‌ی بدی‌اند: هر درج جدید ممکن است وسط داده‌های موجود جا بگیرد و باعث «Page Split» (تکه‌تکه‌شدن فیزیکی صفحات) شود — کندی نامحسوس اما واقعی در سیستم‌های پرترافیک.

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

  • ایندکس خوشه‌ای، ترتیب فیزیکی ذخیره‌ی داده روی دیسک را تعیین می‌کند — نه یک ساختار جدا و اضافه.
  • هر جدول حداکثر یک ایندکس خوشه‌ای دارد، چون داده فقط یک ترتیب فیزیکی می‌تواند داشته باشد.
  • به‌طور پیش‌فرض، کلید اصلی همان ایندکس خوشه‌ای هم هست.
  • در SQLite، همین مفهوم با rowid و ستون INTEGER PRIMARY KEY پیاده‌سازی می‌شود.
  • مقدارهای ترتیبی برای ایندکس خوشه‌ای بهتر از مقدارهای تصادفی عمل می‌کنند.

در درس بعدی سراغ ایندکس غیرخوشه‌ای می‌رویم: ساختار جداگانه‌ای که برای جست‌وجوی سریع روی ستون‌های دیگر (غیر از کلید اصلی) استفاده می‌شود.