ایندکسها مشابه فهرست انتهای یک کتاب عمل میکنند؛ اما وقتی با کوئریهای پیچیده و شرطهای متعدد روبرو هستیم، ایندکسهای تکستونی دیگر پاسخگوی نیاز ما نیستند. اینجاست که ایندکسهای چندستونی (Composite Indexes) وارد عمل میشوند تا سرعت پاسخدهی به درخواستهای ترکیبی را به شکل چشمگیری افزایش دهند.

ایندکس چندستونی چیست؟
ایندکس چندستونی، ساختاری است که از ترکیب دو یا چند ستون در یک ساختار واحد ساخته میشود. برای مثال، به جای داشتن دو ایندکس جداگانه برای «سال تولد» و «معدل»، یک ایندکس ترکیبی شامل هر دو ساخته میشود.
استفاده از این ساختار دو مزیت استراتژیک دارد:
- پاسخگویی به فیلترهای ترکیبی (AND)
زمانی که در دستورWHEREاز چندین شرط همزمان استفاده میکنید. - بهینهسازی عملیات مرتبسازی (ORDER BY)
وقتی دادهها باید بر اساس اولویتهای چندگانه چیده شوند.
ترتیب ستونها (قانون چپ به راست)
حیاتیترین نکته در طراحی ایندکسهای چندستونی، ترتیب قرارگیری ستونها است. پایگاه داده ایندکس را از چپ به راست پیمایش میکند.
فرض کنید ایندکسی روی ستونهای (سال_تولد، معدل) دارید:
- جستجوی بهینه
اگر بر اساس «سال تولد» جستجو کنید، ایندکس با سرعت عالی عمل میکند. - جستجوی ترکیبی
اگر بر اساس هر دو پارامتر جستجو کنید، باز هم بهترین کارایی را خواهید داشت. - نقطه ضعف
اگر قصد داشته باشید فقط بر اساس «معدل» جستجو کنید، این ایندکس در عمل بیفایده خواهد بود چون ستون اول (سال تولد) در شرط شما حضور ندارد.
نکته حرفهای
همیشه ستونی را که در کوئریهای بیشتری تکرار میشود یا تمایزپذیری بالاتری دارد، در سمت چپ (اولین ستون) قرار دهید.
ایندکس پوششی (Covering Index)
یکی از پیشرفتهترین کاربردهای ایندکس چندستونی، ایجاد ایندکس پوششی است. این وضعیتی است که تمام دادههای مورد نیاز یک کوئری (هم در بخش WHERE و هم در بخش SELECT) درون خود ایندکس وجود داشته باشد.
چرا این موضوع مهم است؟
در حالت عادی، پایگاه داده پس از پیدا کردن ردیف در ایندکس، باید به دیسک مراجعه کند تا بقیه ستونها را بخواند (عملیاتی موسوم به Table Lookup یا Bookmark Lookup). اما اگر کوئری شما فقط ستونهایی را بخواهد که در ایندکس موجود است:
- پایگاه داده به سراغ جدول اصلی (دیسک) نمیرود.
- پاسخ از حافظه موقت (RAM) یا ساختار بهینه ایندکس استخراج میشود.
- نتیجه: سرعت پاسخدهی تا ۱۰ برابر افزایش مییابد.
مثال:
اگر ایندکسی روی (کد_ملی، نام_خانوادگی) داشته باشید و کوئری شما این باشد:
SELECT نام_خانوادگی FROM users WHERE کد_ملی = '1234567890';
در اینجا پایگاه داده بدون لمس جدول اصلی، پاسخ را به کاربر برمیگرداند.
چه زمانی از ایندکس چندستونی استفاده کنیم؟
- گزارشگیریهای پیچیده
وقتی کاربران به طور مداوم دادهها را بر اساس فیلترهای ثابت (مثلاً استان + شهر + وضعیت سفارش) فیلتر میکنند. - مرتبسازیهای سنگین
وقتی نیاز است دادهها بر اساس یک ستون فیلتر و بر اساس ستون دیگری مرتب شوند (برای مثال نمایش محصولات «دسته موبایل» به ترتیب «ارزانترین»). - جلوگیری از کندی در حجم بالای داده
در جدولهایی با میلیونها رکورد، ایندکسهای تکستونی دقت کافی برای حذف ردیفهای اضافی را ندارند و زمان پردازش را بالا میبرند.
