هل ممكن شرح أعمدة Explain command في Mysql

السلام عليكم ورحمة الله

أريد أن أعرف بعض المعلومات عن أعمدة Explain command في Mysql

وهي:

  1. Id
  2. Select_type
  3. Table
  4. Partition
  5. Type
  6. Possible_Keys
  7. Key
  8. Key_len
  9. ref
  10. Rows
  11. Filtered
  12. Extra

مع التوضيح ما الذي يجب أن أركز عليه بينهم لكي أحصل على أفضل أداة حينما أستخدم Database queries. وشكرا لكم جميعا!

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

Explain command في MySQL تستخدم لتحليل وفهم كيف يتم تنفيذ استعلام SQL. الأعمدة التي تم ذكرها توفر معلومات حول كيف يتم تنفيذ الاستعلام وما يمكن تحسينه. إليك شرح لكل من هذه الأعمدة:

  1. Id: هذا هو رقم الاستعلام في سلسلة الاستعلامات. يمكن استخدامه لتحديد أي استعلام تريد التركيز عليه إذا كان لديك استعلامات متعددة.
  2. Select_type: يُظهر نوع الاستعلام المستخدم. يمكن أن يكون مثلا "SIMPLE" للاستعلامات البسيطة أو "SUBQUERY" للاستعلامات الفرعية.
  3. Table: اسم الجدول الذي يتم الاستعلام عنه.
  4. Partition: إذا كان الجدول يستخدم تقسيما (partitioning)، فإن هذه العمود توضح التقسيم المستخدم.
  5. Type: يشير إلى نوع الوصول إلى الجدول (مثل "ALL" أو "INDEX"). يمكنك تحسين الأداء بالنظر في هذا النوع.
  6. Possible_Keys: الفهارس المحتملة التي يمكن استخدامها في الاستعلام.
  7. Key: الفهرس الذي تم استخدامه في الاستعلام.
  8. Key_len: طول الفهرس المستخدم في الاستعلام.
  9. ref: المراجع التي تم استخدامها للفهرس.
  10. Rows: عدد الصفوف التي تم قراءتها أثناء تنفيذ الاستعلام.
  11. Filtered: نسبة الصفوف التي تمت مراجعتها بناءً على شروط الاستعلام.
  12. Extra: معلومات إضافية حول تنفيذ الاستعلام، مثل "Using filesort" إذا تم استخدام مرتبة الملفات.

و هذا مثال بسيط لإستخدام بعضها، لنفترض لديك الجدول التالي:

CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100)
);
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    total_amount DECIMAL(10, 2)
);

CREATE INDEX idx_customer_id ON orders (customer_id);

لنأخذ في اعتبارنا استعلام SQL ونفحص نتائج الأمر EXPLAIN له:

EXPLAIN SELECT o.order_id, c.name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.order_date >= '2023-01-01'
AND c.email LIKE '%gmail.com'
ORDER BY o.order_date DESC;


إليك كيف قد تبدو نتائج الأمر EXPLAIN وكيف يمكن تفسيرها:

  • id: هذا هو معرف الاستعلام في النتائج، ويمكن أن يكون مفيدا عند تحليل استعلامات متعددة.
  • table: يحدد الجدول الذي يتم الوصول إليه. في هذا المثال، سيعرض "o" للجدول "orders" و "c" للجدول "customers".
  • type: يصف نوع الوصول المستخدم. من الجيد أن نرى شيئا مثل "ref" أو "eq_ref"، مما يشير إلى استخدام فهرس فعال. ومع ذلك، إذا كان "ALL" (الذي يشير إلى استعلام كامل للجدول)، فقد يشير إلى فرصة لتحسين الأداء.
  • possible_keys: يعرض الفهارس الممكنة التي قد يستخدمها الاستعلام. في هذه الحالة، يمكن أن يكون "idx_customer_id" فهرسا محتملا للجدول "orders"، والمفتاح الرئيسي قد يعتبر للجدول "customers".
  • key: يوضح الفهرس الفعلي الذي تم استخدامه في الاستعلام. إذا تطابق مع عمود "possible_keys"، فهذا عادة مؤشر جيد.
  • ref: إذا كان الاستعلام يستخدم فهرسا للإشارة، سيظهر هنا الأعمدة التي تشارك في الانضمام. على سبيل المثال، "o.customer_id" و "c.customer_id" قد يظهران هنا.
  • rows: يشير إلى عدد الصفوف التي تم فحصها أثناء تنفيذ الاستعلام. قيمة أقل عادة تكون أفضل للأداء.
  • Extra: هذا العمود يمكن أن يقدم معلومات إضافية حول الاستعلام. على سبيل المثال، "Using where" يشير إلى استخدام شرط WHERE في الاستعلام، و "Using filesort" يشير إلى أن هناك عملية فرز ملفات، والتي يمكن تحسينها.

عند استخدام أمر EXPLAIN في MySQL لتحليل استعلامات قاعدة البيانات، يجب أن تركز على عدة جوانب لتحقيق أفضل أداء. يجب مراقبة نوع الوصول، والفهارس المستخدمة، وعدد الصفوف المسترجعة، والمعلومات الإضافية مثل "Using filesort" أو "Using temporary"، وضمان تحسين الشروط والترتيب. يمكنك أيضا تحسين الأداء من خلال استخدام الحدود (LIMIT)، وفهارس متعددة (Composite Indexes)، ومراعاة تأثير التقسيم (Partitioning) إذا كان قائما، والنظر في استخدام ذاكرة التخزين المؤقت (Caching) للاستعلامات المتكررة. بالتركيز على هذه النقاط، يمكنك تحسين استعلامات قاعدة البيانات وتحقيق أداء أفضل.

يمكن أن تساعدك هذه الأعمدة على تحسين أداء استعلاماتك وفهم كيفية عمل قاعدة البيانات أثناء تنفيذ الاستعلام.

وتم شرح هذه الأعمدة بشكل جيد في التعليق السابق لذلك يمكن تقديم مثال لتوضيح الشرح أكثر

لنفترض أن لديك جدول يسمى "orders" وتريد استعلامًا بسيطًا للعثور على جميع الطلبات التي تم إنشاؤها بواسطة مستخدم معين. الاستعلام يبدو كالتالي:

SELECT * FROM orders WHERE user_id = 123; 

الآن دعونا نستخدم EXPLAIN لتحليل هذا الاستعلام. نقوم بتشغيل الاستعلام التالي:

EXPLAIN SELECT * FROM orders WHERE user_id = 123; 

عند استخدام EXPLAIN، يجب أن تركز على تحسين العمود `Type` للحصول على أداء أفضل. على سبيل المثال، إذا كان النوع هو "ALL"، فإن هذا يشير إلى أنه يتم فحص جميع الصفوف، ويجب تحسين الاستعلام أو إضافة فهرس. إذا كان النوع "index"، يمكن تحسين الفهرس المستخدم. إذا كان "const"، فإن ذلك جيد جدًا لأنه يعني أنه تم استخدام قيم ثابتة.

Id

هو رقم تعريف الاستعلام، وتستطيع استخدامه لمقارنة أداء استعلامين مختلفين.

Select_type

يحدد نوع الاستعلام، هناك 10 أنواع مختلفة من الاستعلامات:

  • SIMPLE: استعلام بسيط يقرأ البيانات من جدول واحد.
  • PRIMARY: استعلام أساسي يقرأ البيانات من جدول واحد باستخدام المفتاح الأساسي.
  • JOIN: استعلام ربط يقرأ البيانات من جدولين أو أكثر.
  • UNION: استعلام اتحاد يجمع نتائج استعلامين أو أكثر.
  • UNION ALL: استعلام اتحاد يجمع نتائج استعلامين أو أكثر دون إزالة التكرارات.
  • SUBQUERY: استعلام فرعي يستخدم استعلامًا آخر كجزء منه.
  • EXISTS: استعلام يتحقق مما إذا كان هناك أي صفوف تلبي شرطًا معينًا.
  • IN: استعلام يتحقق مما إذا كان أحد القيم في صف معين موجودًا في مجموعة من القيم.
  • ALL: استعلام يتحقق مما إذا كانت جميع القيم في صف معين موجودة في مجموعة من القيم.

Table

اسم الجدول الذي يتم استرداد البيانات منه.

Partition

اسم القسم الذي يتم استرداد البيانات منه.

Type

يحدد نوع الوصول إلى البيانات، وهناك 6 أنواع مختلفة من الوصول:

  • ALL: الوصول إلى جميع الصفوف في الجدول.
  • RANGE: الوصول إلى صفوف تقع ضمن نطاق معين.
  • INDEX: الوصول إلى صفوف باستخدام مؤشر.
  • REF: الوصول إلى صفوف باستخدام مرجع إلى جدول آخر.
  • EQ_REF: الوصول إلى صفوف باستخدام مرجع متساوي إلى جدول آخر.
  • ALL_EXCEPT: الوصول إلى صفوف لا تقع ضمن نطاق معين.

Possible_Keys

مفاتيح فهرس MySQL المحتملة التي يمكن استخدامها لتحسين أداء الاستعلام.

Key

المفتاح الفعلي المستخدم لتحسين أداء الاستعلام.

Key_len

طول المفتاح المستخدم لتحسين أداء الاستعلام.

ref

العمود الذي يُستخدم لربط استعلامين.

Rows

عدد الصفوف التي سيتم إرجاعها من الاستعلام.

Filtered

النسبة المئوية للصفوف التي تمت تصفيتها قبل إرجاعها من الاستعلام.

Extra

حقل إضافي قد يحتوي على معلومات إضافية حول الاستعلام.

ما الذي يجب التركيز عليه بينهم؟

هناك بعض العوامل التي يجب مراعاتها عند استخدام Explain command لتحسين أداء استعلامات MySQL:

  • Select_type واستخدام النوع الصحيح من الاستعلام للبيانات التي يتم استردادها، أي يجب استخدام استعلام JOIN إذا كان من الضروري الجمع بين البيانات من عدة جداول.
  • Type واستخدام نوع الوصول الصحيح إلى البيانات، مثل استخدام الوصول INDEX إذا كان هناك مؤشر يمكن استخدامه لتحسين أداء الاستعلام.
  • Key الإعتماد على المفتاح الصحيح لتحسين أداء الاستعلام، كتحديد المفتاح الصحيح باستخدام الأمر SHOW INDEXES.
  • ref، حيث يجب استخدام العمود الصحيح لربط استعلامين.
  • Rows من أجل تحسين عدد الصفوف التي تتم إرجاعها من الاستعلام عن طريق استخدام عوامل تصفية أكثر تحديدًا.
  • Filtered، لتحسين النسبة المئوية للصفوف التي تمت تصفية قبل إرجاعها من الاستعلام، من خلال استخدام عوامل تصفية أكثر تحديدًا.

بعض النصائح الإضافية لتحسين أداء استعلامات MySQL:

  • استخدام مؤشرات MySQL لتحسين أداء الاستعلام عن طريق تسريع عملية البحث عن الصفوف.
  • استخدام عوامل تصفية أكثر تحديدًا لتحسين أداء الاستعلام عن طريق تقليل عدد الصفوف التي تتم إرجاعها من الاستعلام.
  • استخدام قواعد بيانات مناسبة لتحسين أداء الاستعلام عن طريق تقليل عدد الأعمدة التي تتم إرجاعها من الاستعلام.
  • تحسين بنية قاعدة البيانات الخاصة بك لتحسين أداء الاستعلام عن طريق استخدام الجداول المناسبة والعلاقات المناسبة.