Mohammad Bohluli
Mohammad Bohluli
خواندن ۷ دقیقه·۲۴ روز پیش

دیتابیس بدون ایندکس، مثل کتابخانه بدون فهرست! (قسمت سوم از مفاهیم دیتابیس)

به قسمت سوم از سری مجموعه مفاهیم دیتابیس خوش اومدی، توی این قسمت میخواییم به جادوگرهای پنهان سرعت یعنی ایندکس ها در دیتابیس‌ها بپردازیم. دقت کنید که توی این سری مجموعه ما با انواع مفاهیم دیتابیس آشنا میشیم و کاری با کد زدن و نوع خاصی از دیتابیسا ها نداریم

همچنین قسمت قبل رو میتونید از لینک زیر 👇بخونید:

وقتی جدول‌ها عاشق می‌شوند (قسمت دوم از مفاهیم دیتابیس)



✅ ایندکس ها چی هستن ؟؟؟

  • فرض کنیم داریم یه کتاب حجیم با هزاران صفحه رو میخونیم. بدون داشتن فهرست یا ایندکس، اگر بخواییم مطلب خاصی رو پیدا کنیم باید دونه دونه ورق بزنیم تا پیداش کنیم. خب طبیعتا این کار خیلی خسته کننده میشه
  • حالا اگه اون کتابمون فهرست یا همون index داشته باشه خیلی راحت میبینیم فلان مطلب توی کدوم صفحه اس و مستقیم میریم سر وقتش و دیگه نیاز نیست کل کتابو بگردی
  • دیتابیس هم دقیقاً همین رخ میده. وقتی شما ایندکس میسازی، یک ساختار داده‌ای ایجاد میشه که به پایگاه داده میگه هر داده کجا قرار گرفته. مثلاً اگه یک ایندکس روی ستون name در جدول Students داشته باشید و به دنبال دانشجویی به اسم "علی" باشید، دیتابیس به جای جستجو در همه رکوردها، مستقیماً به ردیف‌های مربوط به "علی" میره و نتیجه رو خیلی خیلی سریع‌تر به شما میده.
  • پس وقتی روی یک یا چند ستون ایندکس انجام میدیم، دیتابیس لیستی از مقادیر مرتب شده رو از اون ستون مورد نظر به همراه اشاره گر هایی به رکورد های اصلی ذخیره میکنه و دیگه به جای اینکه روی جدول اصلی جست و جو کنه میره توی جدول ایندکس خیلی سریع داده مربوطه رو پیدا میکنه .انگاری که پس قضیه یه جدول ایندکس ساخته میشه و دیتابیس از طریق اون ایندکس گذاری رو انجام میده مثل عکس زیر



✅ انواع ایندکس ها ؟؟؟

به طور کلی سه دسته بندی برای ایندکس ها داریم:

  • ایندکس اولیه (Primary Index) 👈 این نوع ایندکس به طور پیش‌فرض روی کلید اصلی (Primary Key) ستون‌ها ایجاد میشه و تضمین می‌کنن که هر مقدار در کلید اصلی یکتا (Unique) باشه و به صورت خودکار موقع تعریف کلید اصلی ساخته می‌شود. این ایندکس معمولاً برای جستجوی سریع استفاده میشه. وقتی Primary Key درست کنی خود دیتابیس این کارا رو برات میکنه.
  • ایندکس خوشه‌بندی (Clustered Index) 👈 توی این نوع ایندکس، داده‌های جدول به ترتیب فیزیکی بر اساس این ایندکس مرتب میشن. این یعنی که تنها یک ایندکس خوشه‌بندی برای هر جدول میتونه وجود داشته باشه، چرا؟ چون داده‌های جدول تنها میتونن به یک شکل مرتب بشن. این نوع ایندکس‌ها دسترسی بسیار سریع به داده‌ها رو دارن.
  • ایندکس غیرخوشه‌بندی (Non-Clustered Index) 👈 توی این نوع ایندکس، داده‌های جدول به ترتیب خاصی مرتب نمیشن، اما یک اشاره‌گر به محل ذخیره داده‌ها در خود جدول دارن. پس میتونیم برعکس ایندکس خوشه بندی، چندین ایندکس غیرخوشه‌بندی روی یک جدول ایجاد داشته باشیم.
سوال: یعنی چی میگی داده ها به صورت فیزیکی مرتب میشن(فرق خوشه بندی و غیرخوشه بندی) ؟؟؟
یعنی اون داده مستقیما با ایندکس شدن روی دیسک میشینه و دیگه عین ایندکس Non-Clustered پس قضیه جدول درست نمیکنه توی Non-Clustered یه جدول برای ایندکس درست میشه و با اشاره گر هایی به اون جدول اصلی متصل میشه امیدوارم قابل فهم توضیح داده باشم


✅ سایر ایندکس ها:

یه سری ایندکس خاص دیگه داریم که خب هر کدوم به تنهایی یه مقاله جدا میطلبه ولی کوتاه هرکدوم رو توضیح میدم و اگه خواستین بیشتر راجبشون بدونید سرچشون کنید

  • ایندکس Bitmap 👈 برای ستون‌هایی با تعداد مقادیر کم (کاراکترهای محدود) مناسبه، و معمولاً در انبارهای داده (Data Warehousing) استفاده میشه.
  • ایندکس Hash 👈 از یک تابع هش برای نگاشت مقادیر به موقعیت‌های خاص استفاده میکنه؛ ایده‌آل برای جستجوهای تطبیق دقیق (Exact Match).
  • ایندکس Filtered 👈 تنها زیرمجموعه‌ای از رکوردها را بر اساس یک شرط خاص ایندکس میکنه و برای بهبود سرعت کوئری‌ها روی ستون‌های پرتکرار مناسبه.
  • ایندکس Covering 👈 شامل تمامی ستون‌های موردنیاز کوئری درون خود ایندکس، و دیگه نیازی به دسترسی به جدول اصلی نیست.
  • ایندکس Function-Based 👈 ایندکسی که براساس نتیجه یک تابع یا عبارت اعمال شده بر روی یک یا چند ستون ایجاد میشه.
  • ایندکس Full-Text 👈 برای جستجوی متن کامل طراحی شده و امکان جستجوی کارآمد در داده‌های متنی را فراهم میکنه.
  • ایندکس Spatial 👈 برای ایندکس کردن داده‌های جغرافیایی کاربرد دارد، مثل داده‌های موقعیت‌یابی جغرافیایی.



سه نوع ساختار داده مهم توی دیتابیس ها هستش که یه صورت خلاصه بررسیشون میکنیم:

✅ ساختارداده B-tree:

یک ساختمان داده قدرتمند که توی ایندکس ها ازش استفاده میشه، بریم یه خرده بررسیش کنیم:

  • ساختاری سلسله‌مراتبی داره که شامل یک گره ریشه (Root Node)، گره‌های میانی (یا گره‌های ایندکس) و گره‌های برگ(leaf nodes) هست و همون طور که توی شکل زیر میبینید در هر گره‌ی B-Tree، یک آرایه مرتب(ordered) از کلیدها و اشاره‌گرها به گره‌های فرزند وجود دارد.

حالا اصلا چرا B-tree ؟؟؟

  • متعادل‌سازی خودکار(Self-Balancing) 👈 B-Tree همیشه ارتفاع خودشو در حالت متعادل نگه می‌دارد(چقد باهوشه)، حتی وقتی داده اضافه یا حذف میشه. این ویژگی باعث میشه عملیات درج، حذف، و جستجو با زمان‌بندی لگاریتمی(time complexity) خوبی انجام بشه.
  • مرتب بودن(ordered) 👈 B-Tree داده‌ها را به صورت مرتب نگه میداره، بنابراین جستجوهای بازه‌ای مثل سفارشات فلان تاریخ x تا فلان تاریخ y یا مقاله های فلان x روز تا فلان y روز رو و مقایسه‌ها سریع‌تر انجام میده.
  • سازگار با دیسک(Disk-Friendly) 👈 B-Tree طوری طراحی شده که با حافظه‌های مبتنی بر دیسک خوب کار میکنه. هر گره B-Tree معمولاً معادل یک بلاک دیسکه و با این کار، عملیات دسترسی به دیسک به حداقل می‌رسه.


✅ ساختارداده Hash Table:

  • جدول هش یک نوع ساختار داده‌ای هست که برای ایندکس‌های هش استفاده میشه و به کمک یک تابع هش هم کار میکنه.این جدول شامل مجموعه‌ای از باکت‌ها هستش. هر باکت شامل آدرس‌هایه که به سطرهای جدول داده اشاره دارن.
باکت چیه ؟؟؟
باکت (Bucket) در جدول هش به معنی یک فضای ذخیره‌سازیه که میتونه شامل یک یا چند مقدار باشه. در واقع، باکت‌ها مکان‌هایی هستن که داده‌ها در جدول هش به اون ها map یا همون اختصاص داده میشه و تابع هش مشخص میکنه که هر داده در کدام باکت قرار بگیره
  • ایندکس‌های هش از تابع هش استفاده میکنن تا کلیدها را به باکت‌های مشخصی در جدول هش اختصاص بدن، که این کار باعث میشه داده‌ها رو با سرعت بسیار بالا و در زمان ثابت پیدا کنیم(به همین خوشمزگی).
  • حالا این نوع ایندکس کجا خوبه و کجا بده ؟ برای جستجوهای تطبیق دقیق (مثل جستجوی داده با یک مقدار خاص) بسیار سریع هستن، چون تابع هش مستقیماً محل دقیق داده را مشخص میکنه و میزنه تو خال. اما این ایندکس‌ها برای جستجوهای بازه‌ای (مثل پیدا کردن داده‌ها بین دو مقدار) یا مرتب‌سازی مناسب نیستن و نبیاد ازش استفاده کرد پس حواستون باشه


✅ ساختارداده Bitmaps :

  • در این نوع ایندکس ها، برای هر سطر یک بیت (0 یا 1) اختصاص داده میشه. این بیت نشون میده که که آیا مقدار خاصی توی اون سطر وجود داره یا نه. به زبون ساده‌تر بخوام بگم، بیت‌مپ یک آرایه باینری (از 0 و 1 تشکیل شده) که حضور یا عدم حضور یک مقدار خاص رو در هر سطر جدول نشون میده.
  • برای ستون‌هایی که تعداد مقادیر ممکن کمی دارند (مثلاً "true" و "false") مناسب‌ هستن و به ویژه در جستجوهای پیچیده با شرایط متعدد کارایی خوبی دارند.
  • و به عنوان نکته اخر عملیات‌هایی مثل AND، OR، و NOT روی بیت‌ها به راحتی و با سرعت بالا انجام میشه، پس برای کوئری‌های تحلیلی که چندین ستون را شامل میشن، مناسب هستن.

✅ کی و چه موقع استفاده کنیم ؟؟؟

دقت کنید درسته indexing سرعت رو زیاد میکنه ولی حواستون باشه بدی هایی هم داره مثلا اگه توی دیتابیس زیادی عملیات insert و update دارید از ایندکس کمتر استفاده کنید چون علاوه بر دیتا اصلی اون جدول های ایندکس هم باید بروز بشن و این ممکن دیتابیس رو کند کنه

البته خب یکسری جاها باید برای بدست اوردن یه چیزی، چیز دیگه ای رو از دست داد و بسته به پروژه و نوع کار مشخص میشه چه موقع از ایندکس استفاده کنیم یادتون نره که توی صنعت نرم افزار همه چیز trade off هست و خوب و بد مطلق نداریم


امیدوارم مورد استفاده اتون قرار گرفته باشه

اگه دوست داشتید توی کانال تلگرامیمون هم عضو بشید LearnByLearn@

بدروووود تا قسمت بعدی ❤️

ایندکس دیتابیسindex databasesqldatabasebtree
علاقمند به تکونولوژی و هرچی که بهش مربوطه، کانال تلگرام LearnByLearn@
شاید از این پست‌ها خوشتان بیاید