majid
majid
خواندن ۵ دقیقه·۲ سال پیش

What is a Database Index?

ایندکس کردن دیتابیس یک مفهوم مهم در دیتابیس‌ها است. هرکسی که بخواهد یک دیتابیس طراحی کند یا از یک دیتابیس استفاده کند باید با آن آشنا باشد.

در دنیای واقعی بارها ایندکس گذاری رو دیده ایم. مثل ایندکس حروف الفبا یا ایندکس موضوعی در کتابخانه‌

معمولا یک ایندکس بر روی ستون‌ یا ستون‌هایی ایجاد می‌شه که ما میخواهیم با استفاده از کوئری هایی مثل WHERE اطلاعاتی از اون ستون کسب کنیم. اگر یک ایندکس ایجاد نکرده باشیم، دیتابیس کل ردیف‌های جدول را می‌خواند تا خروجی مناسب کوئری WHERE را پیدا کند. اگر تعداد ردیف‌ها خیلی زیاد باشد این باعث می‌شود که ‌API ها کند شوند و .....

ایندکس، حاوی تمام اطلاعات لازم برای دسترسی سریع به داده‌ها است.اندازه داده ‌ها ‌( تعداد و سایز دیتاهای مختلف صعودی هستند) به سرعت در بیشتر شدن است. در واقع، برخی از غول‌های فناوری چند صد پتابایت داده را در روز پردازش می‌کنند. ذخیره همه این داده‌ها در یک دیتابیس خوب و لازم است، اما برای یک شرکت، دسترسی موثر به آن داده‌ها برای موفقیت بسیار مهم است.

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

ایندکس چیست؟

ایندکس یک ساختار داده خاص است که به ما امکان می‌دهد اطلاعات رو به سرعت پیدا کنیم. این ساختار مانند یک Binary Tree است. ( مقادیر کوچکتر در سمت چپ و مقادیر بزرگتر در سمت راست) بجای اجبار به جست و جوی کل ردیف‌های دیتابیس کافی است مقادیر ردیف ‌را در ایندکس ( binary tree) مقایسه کنیم تا سریعتر به نتیجه برسیم.

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

ذخیره داده‌ها در ساختاری جدید و همچنین ایجاد و ذخیره اشاره‌گر، همگی نیاز به داشتن حافظه‌ اضافی از حافظه اصلی دیتابیس دارند. این یعنی هرچند در زمان جست و جو سریعتر می‌شویم اما منابع بیشتری ( اینجا حافظه‌ ) را نیاز خواهیم داشت.

ساختن یا انتخاب ایندکس؟

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

اگرچه کلید و ایندکس به جای یکدیگر استفاده می شوند، کلید به معنای محدودیتی است که بر رفتار ستون اعمال می شود. کلید اصلی یک فیلد غیر تهی است که به طور منحصر به فرد هر ردیف را شناسایی می کند. اما ایندکس یک ساختار داده خاص است که جستجوی داده‌ها را در جدول تسهیل می کند.

ساختن یک ایندکس جدید به فضای دیسک بیشتری نیازی دارد. بنابراین غیر منطقی است که همه ترکیب‌های ممکن را ایندکس کنیم. پس برای ساخت یک ایندکس به موارد زیر دقت کنید:

  • ایندکس را برای جدول‌هایی بسازید که انتظار دارید ستون و ردیف‌های زیادی داشته باشد.
  • ستون‌هایی را ایندکس کنید که انتظار دارید در مورد آنها جست و جو شود. برای مثال ایندکس کردن شماره موبایل بهتر است تا ایندکس کردن نام یا آدرس یک فرد در جدول مشخصات فردی.
  • ستونی را ایندکس کنید که UNIQE نباشد. برای مثال ایندکس کردن ملی کد ملی ( به این دلیل که برای هر فرد یکتا هستش) کمکی برای بهبود جست و جو نمی‌کند. اما ایندکس کردن شماره موبایل یا کد شهر برای جست و جو کمک می‌کند.
اغلب مجبور هستیم روی یک ستون دو نوع ایندکس انجام دهیم. برای مثال، به منظور جست و جو نام یک نویسنده لازم است یک ایندکس روی ستون نام خانوادگی داشته باشیم و یک ایندکس روی ترکیب ستون‌های نام و نام خانوادگی

چیزهایی که باید در مورد ایندکس به خاطر بسپارید

  • اگر یک جدول بیش از یک ایندکس داشته باشد، INSERT کردن داده داخل جدول را کند می‌کند. به این دلیل که علاوه بر قرار گرفتن در مکان درست داخل جدول، ایندکس نیز نیاز به بررسی و تنظیم مجدد دارد که همین باعث می‌شود زمان بیشتری صرف شود. ( اضافه کردن یک node به binary tree !!!)

اگر نیاز است تغییرات زیادی روی جدولی که ایندکس دارد انجام دهیم، باتوجه به شرایط، شاید بهتر باشد ابتدا ایندکس را حذف کنیم، جدول را تغییر دهیم و سپس ایندکس جدید را بسازیم. فرض کنید میخواهید تعداد زیادی کتاب به دیتابیس کتابخانه اضافه کنید ( INSERT ) بهتر است ایندکس را حذف کنیم و داده های جدید را به جدول اضافه کنیم و دوباره ایندکس گذاری کنیم. ( normalization داده ها تاثیر گذار است)

ایندکس گذاری بصورت پیش فرض توسط دیتابیس انجام می‌شود. به این معنی که اگر یک insert, update or delete انجام شود، باید روی تمامی ایندکس های آن جدول هم انجام شود !!!!!

پس هرچند ایندکس باعث می‌شود که سرعت جست و جو بهتر شود اما در بعضی موارد به علت اینکه نیاز به حافضه دارد و همینطور عملیات روی binary tree زمانبر است باعث ایجاد مشکلاتی می‌شود.

یک مثال از تاثیر ایندکس روی جست و جو

فرض کنید ما میخواهیم نام یک کتاب رو دیتابیسی که ۱ میلیون کتاب دارد جست و جو کنیم. جست و جوی عادی در بدترین حالت کل ردیف های یک دیتابیس را جست و جو می‌کند. پس پیچیدگی این جست و جو برابر با O(n) خواهد بود. ( اگر متوجه این قسمت نشدید باید الگوریتم و پیچدگی های زمانی رو مطالعه کنید)

حالا فرض کنید ما یک ایندکس روی ستون عنوان کتاب‌ها و براساس حروف الفا داریم. کافی است عنوان کتاب رو با ردیف ۵۰۰،۰۰۰ در ایندکس مقایسه کنیم. سپس براساس نتیجه جست و جو، ایندکس وسط سمت چپ یا راست را دوباره مقایسه می‌کنیم و ..... در بدترین شرایط ۲۰ بار نیاز هست که این ایندکس جست و جو شود. ( ۲ به توان ۲۰ برابر ۱۰۴۸۵۷۶ است. اگر این موضوع رو متوجه نشدید درخت باینری و پیچیدگی های زمانی را مطالعه کنید) پس با داشتن ایندکس بدترین زمان جست و جو برابر با O(log n) خواهد بود!!!!!

در پست بعدی با ایندکس بیشتر آشنا می‌شید و چند مورد از ایندکس‌های PostgreSQL را خواهید دید.



ایندکسدیتابیسindex
شاید از این پست‌ها خوشتان بیاید