توضیح و مثال جامع برای SQL EXPLAIN ANALYZE
EXPLAIN ANALYZE یک دستور قدرتمند در SQL است که به شما امکان میدهد جزئیات دقیقی از نحوه اجرای یک پرس و جو توسط موتور پایگاه داده را بدست آورید. این دستور نه تنها طرح اجرای پرس و جو را مانند دستور EXPLAIN
معمولی نشان میدهد، بلکه زمان صرف شده در هر مرحله از اجرای پرس و جو را نیز اندازهگیری میکند. این اطلاعات میتواند برای عیبیابی و بهینهسازی پرس و جوهای پیچیده بسیار مفید باشد.
مزایای استفاده از EXPLAIN ANALYZE:
- شناسایی مشکلات عملکرد: EXPLAIN ANALYZE میتواند به شما در شناسایی بخشهایی از پرس و جو که زمان زیادی را برای اجرا میبرند، کمک کند. این اطلاعات میتواند برای بهینهسازی پرس و جو و بهبود عملکرد آن مفید باشد.
- درک بهتر طرح اجرای پرس و جو: EXPLAIN ANALYZE جزئیات دقیقی از نحوه اجرای پرس و جو توسط موتور پایگاه داده را ارائه میدهد. این اطلاعات میتواند برای درک بهتر نحوه عملکرد پرس و جو و شناسایی فرصتهای بهینهسازی مفید باشد.
- حل مشکلات پرس و جو: EXPLAIN ANALYZE میتواند به شما در حل مشکلات پرس و جو مانند bottlenecks، عدم استفاده از ایندکسها و subqueries ناکارآمد کمک کند.
نحوه استفاده از EXPLAIN ANALYZE:
برای استفاده از EXPLAIN ANALYZE، باید دستور زیر را قبل از پرس و جوی مورد نظر خود بنویسید:
EXPLAIN ANALYZE
به عنوان مثال، دستور زیر جزئیات اجرای پرس و جوی SELECT * FROM customers WHERE name = 'John Doe'
را با زمان صرف شده در هر مرحله نشان میدهد:
EXPLAIN ANALYZE
SELECT * FROM customers WHERE name = 'John Doe';
نتایج EXPLAIN ANALYZE:
نتایج EXPLAIN ANALYZE در یک جدول نمایش داده میشود که شامل ستونهای زیر است:
- id: شناسه منحصر به فرد برای هر ردیف در طرح اجرا
- select_type: نوع عملیات انتخاب (مانند
SIMPLE
،TABLE SCAN
،JOIN
) - table: نام جدول مورد استفاده در این مرحله
- type: نوع عملیات انجام شده در این مرحله (مانند
ALL
،INDEX
،JOIN
) - possible_keys: لیستی از کلیدهای ممکن برای استفاده در این مرحله
- key: کلید واقعی که در این مرحله استفاده شده است (اگر وجود داشته باشد)
- rows: تعداد ردیفهایی که در این مرحله پردازش شدهاند
- filtered: درصدی از ردیفهایی که در این مرحله فیلتر شدهاند
- joined: تعداد ردیفهایی که در این مرحله به هم پیوستهاند
- copies: تعداد دفعاتی که ردیفها در این مرحله کپی شدهاند
- total_time: زمان کل صرف شده در این مرحله
- cpu_time: زمان صرف شده توسط CPU در این مرحله
- io_time: زمان صرف شده برای خواندن و نوشتن دادهها در این مرحله
مثال:
فرض کنید پرس و جوی زیر را اجرا میکنید:
EXPLAIN ANALYZE
SELECT * FROM customers
WHERE name = 'John Doe'
AND city = 'New York';
نتایج EXPLAIN ANALYZE ممکن است به صورت زیر باشد:
id | select_type | table | type | possible_keys | key | rows | filtered | joined | copies | total_time | cpu_time | io_time
---+-------------+-------+------+---------------+-----+-------+---------+---------+---------+------------+-----------+-----------
۱ | SIMPLE | customers | TABLE | name,city | name | 100 | 0.00% | 1.00 | 1.00 | 0.000032 | 0.000020 | 0.000012
این نتایج نشان میدهد که پرس و جو با اسکن جدول customers
بر اساس کلید name
شروع میشود. سپس ردیفهایی که با معیار city = 'New York'
مطابقت ندارند، فیلتر میشوند. در نهایت، ردیفهای باقیمانده به سادگی کپی میشوند و هیچ پیوندی انجام نمیشود.
نکات مهم:
- EXPLAIN ANALYZE میتواند بر عملکرد پرس و جو تأثیر بگذارد، بنابراین باید با احتیاط از آن در محیطهای تولید استفاده شود.