اهمیت نشانه گذاری در بانک اطلاعاتی MySQL

نشانه گذاری یا Index عناصر یک جدول در بانک اطلاعاتی مخصوصا در بانک اطلاعاتی همچون MySQL زمانی مهم می شود که شما در جدال با اسکریپتی باشید که موجب کرش و برهم ریختن یک سرور می شود .

چند روز پیش یکی از دوستان گلایه می کرد از کندی سایت و در نهایت بسته شدن سایت که پس از بررسی به اسکریپت خبرنامه رسیدیم .  این اسکریپت در مجموع به قول برنامه نویسش 4 کوئری مصرف می کرد در هر بار اجرا  , اما به صورت علمی که زمان اجرای هر کوئری رو بررسی می کردیم متوجه می شدیم یکی از کوئری ها با دستورات تو در تو  JOIN اطلاعاتی رو به صورت تناسبی از جداول کناری بیرون می کشد حال آنکه این جداول برای اینکار بهینه نشده اند .

فرض بگیرید این کد قرار است در هر بار اجرا برای 10 هزار نفر اجرا شود و یک خبرنامه ارسال شود .

 

قبل از نشانه گذاری در جداول بانک اطلاعاتی

photo_2015-12-28_08-41-03

 

بعد از نشانه گذاری در بانک اطلاعاتی

photo_2015-12-28_08-41-12

 

تفاوت رو در میزان زمانی که صرف شده یک یکسان اجرا شود ببینید  یکی 15 ثانیه و دیگری کمتر از 0.2 ثانیه . حالا ضربدر 10 هزار تا کنید مثلا  ببینید چه اتفاقی می افتد .

آیا نشانه گذاری یعنی دست بردن در کدهای مثلا PHP  ؟!  خیر  نشانه گذاری ربطی به PHP ندارد البته می تواند از آن طریق کنترل کند ولی مطلقا مربوط به دیتابیس است .

حالا ما کد مادر رو با هم بررسی می کنیم .

 

SELECT DISTINCT newsletter_users.email, newsletter_users.sms_text, newsletter_users.alert_sms_finished, newsletter_users.sent_any_sms, newsletter_users.sms_notification, newsletter_users.cell, newsletter_users.sms_credits, newsletter_users.settings_key FROM newsletter_users
JOIN newsletter_users_majors ON newsletter_users_majors.user_id = newsletter_users.id
LEFT JOIN newsletter_users_jobs ON newsletter_users_jobs.user_id = newsletter_users.id
JOIN newsletter_users_provinces ON newsletter_users_provinces.user_id = newsletter_users_majors.user_id
JOIN newsletter_users_days ON newsletter_users_days.user_id = newsletter_users_provinces.user_id
WHERE
(newsletter_users.disabled = ‘0’) AND
(newsletter_users.verified = ‘1’) AND
(($jfield_query AND $jcity_query) OR ($jjob_query)) AND
(newsletter_users_days.day = ‘$today’)

 

 

خلاصه این کد این است که جداول زیر درگیر می شوند :

 

newsletter_users

newsletter_users_majors

newsletter_users_jobs

newsletter_users_provinces

newsletter_users_days

 

که در این جداول فیلد user_id است که تناظر یک به یک دارد .

 

سوال من این است آیا این فیلد در همه این جداول حضور دارد ؟!  بله حضور دارد و در ضمن قابل index است .

اگر من بیام روی همه این فیلدها index بگذارم یعنی چه اتفاقی می افتد  ؟!

مثالی که می تونم برای روشن شدن قضیه بگم اینه که شما از یک مامور آمار بخواهید هر بار که می خواهد قبض آب رو به مشتری بدهد اما بگردد دنبال خونه های قرمز – سبز و صورتی و بعد قبض های سبز رو به سبز و …..

مامور آمار بیچاره در حالت اولیه باید هر روز خونه های آبی و … رو بشمرد و شناسایی کند

ولی اگر ما بهش بگیم دقیقا چندتا خونه آبی داریم و دقیقا در چه نقظه ای هستند چقدر در زمانش صرفه جویی می شه ؟

phpMyAdmin 4.3.9

این نشانه گذاری برای این دوستمون به اندازه هزینه ارتقا به سرور اختصاصی تمام شده است پس خوب درک می کند چقدر اهمیت داشت همین تغییر ساده در ساختار جداول بانک اطلاعاتی

 

پیروز باشید .

دیدگاه‌ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *