برنامه نویسی

نحوه خواندن خروجی MySQL EXPLAIN

MySQL یکی از پرکاربردترین RDMS هاست. ما انواع مختلف پرس و جو را در MySQL می نویسیم. برخی قبلا ساده بودند و برخی از کوئری ها پیچیده بودند که حتی بیش از 4 تا 5 جدول را شامل می شد. وقتی پرس و جوهای پیچیده می نویسیم، درک تأثیر پرس و جو ضروری است. گاهی اوقات پرس و جوهای پیچیده نوشته شده ضعیف می تواند دلیل عملکرد ضعیف پایگاه داده باشد. ما می توانیم از EXPLAIN برای یافتن کلیدهای مورد استفاده در پرس و جو و نحوه بهینه سازی آنها استفاده کنیم. این وبلاگ درباره این است که چگونه می توانیم اطلاعات مفیدی را از نتیجه EXPLAIN بدست آوریم.

خروجی توضیح حاوی اطلاعات مربوط به هر جدول مورد استفاده در پرس و جو و به ترتیبی است که MySQL جداول را در حین پردازش پرس و جو می خواند. به این معنی که MySQL داده ها را از جدول موجود در ردیف اول می خواند، سپس ردیف منطبق را در جدول موجود در ردیف دوم و غیره پیدا می کند.

خروجی را توضیح دهد

ستون هایی که خروجی EXPLAIN را ارائه می دهند هستند id، select_type، جدول، پارتیشن‌ها، کلیدهای ممکن، کلید، key_len، ref، ردیف‌ها، فیلتر شده، نوع و اضافی.

نوع را انتخاب کنید: انتخاب انواع مختلفی دارد. این ستون انواع انتخاب را نشان می دهد. انواع مختلف انتخاب ها عبارتند از SIMPLE، UNION، SUBQUERY و DERIVED.

1.1 ساده: انتخاب ساده است. این بدان معناست که هیچ سوال فرعی یا اتحادی در اینجا استفاده نشده است.

1.2 استعلام فرعی: هر پرس و جوی انتخابی که در پرس و جو انتخاب دیگری استفاده می شود اما در عبارت FROM استفاده نمی شود. مثلا،
SELECT * FROM student_detail where address_key in (SELECT id from address where state="Karnataka");

استعلام فرعی

1.3 نشات گرفته: پرس و جوی SELECT مورد استفاده در عبارت FROM یک کوئری SELECT دیگر یک DERIVED select_type است. مثلا، SELECT id FROM (SELECT * FROM address) ad;

نشات گرفته

1.4 اتحاد. اتصال: دومین پرس و جو SELECT در UNION یا نوع پرس و جو SELECT بعدی یک UNION select_type است. مثلا،
SELECT state FROM address where id = 2 UNION SELECT state from address where id = 4 UNION SELECT state from address where id = 3;

اتحاد. اتصال

جدول: نام جدول. این می تواند نام جدول یا نام ارائه شده توسط ما در طی یک پرس و جو یا (جدول مشتق شده در ردیف با id vale n) باشد.

پارتیشن بندی شده: پارتیشن جدولی که داده ها از آن واکشی می شوند. اگر جدول پارتیشن بندی نشده باشد، مقدار NULL را نشان می دهد، یا ممکن است اگر هیچ یک از جداول پارتیشن بندی نشده باشد، این ستون در نتیجه خروجی وجود نداشته باشد.

کلیدهای_ممکن: تمام ایندکس های ممکن را نشان می دهد که MySQL می تواند از ایندکس برای یافتن ردیف های جدول استفاده کند. اما این کلید به ترتیب جدول در نتیجه خروجی وابسته نیست، یعنی به ترتیب جدولی که در آن MySQL پرس و جو را پردازش می کند، بستگی ندارد. بنابراین ممکن است از هیچ یک از کلیدها استفاده نشود. در زیر توضیح داده ام.

کلید: کلید واقعی را نشان می دهد که برای یافتن ردیف های جدول استفاده می شود. به طور معمول این کلید یکی از کلیدهای موجود در کلیدهای امکان پذیر بود، اما می تواند یک کلید متفاوت نیز باشد. برای مثال، اگر برای واکشی مستقیم تمام ستون‌های مورد نیاز از یک فهرست با استفاده از اسکن فهرست بهینه شده باشد، MySQL می‌تواند از اسکن فهرست به جای اسکن ردیف داده استفاده کند.

key_len: طول کلید مورد استفاده برای دریافت داده را نشان می دهد. اگر کلید یک کلید چند بخشی است، key_len به ما کمک می کند تا بفهمیم چند قسمت از کلید چند قسمتی برای دریافت داده ها استفاده شده است.

مرجع: نشان می دهد که کدام ستون در برابر ستون موجود در کلید برای واکشی داده ها از جدول استفاده می شود. می تواند const نیز باشد، یعنی از یک مقدار const برای مقایسه استفاده می شود. به عنوان مثال، SELECT * FROM student_detail sd آدرس داخلی JOIN ad ON sd.address_key = ad.id WHERE sd.id = 2. در این کوئری، کلید مورد استفاده در عبارت JOIN نیز در عبارت Where وجود دارد و به این معنی است که ما در حال واکشی تعداد ثابتی از ردیف ها با استفاده از آن کلید از جدول هستند.

ردیف ها: نشان می دهد که تعداد تقریباً (نه واقعی) ردیف هایی که باید بررسی شوند.

فیلتر شده: ستون فیلتر شده درصد تخمینی از ردیف های جدول را نشان می دهد که بر اساس شرایط جدول فیلتر شده اند. حداکثر مقدار 100 است، به این معنی که هیچ فیلتری در ردیف‌ها رخ نداده است. مقادیر کاهش یافته از 100 نشان دهنده افزایش مقادیر فیلتر است. ردیف‌ها تعداد تخمینی ردیف‌های بررسی‌شده را نشان می‌دهند و ردیف‌های × فیلتر شده تعداد ردیف‌های متصل به جدول زیر را نشان می‌دهد. به عنوان مثال، اگر ردیف 1000 و فیلتر شده 50.00 (50%) باشد، تعداد ردیف هایی که باید به جدول زیر متصل شوند 1000 × 50% = 500 است. می توانید سند رسمی MySQL را بررسی کنید.

توضیح خواهم داد نوع و اضافی استفاده از ستون در وبلاگ بعدی هم نیاز به توضیح مفصل است و هم یک وبلاگ برای این کار کافی نیست.

نوشته های مشابه

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

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

دکمه بازگشت به بالا