أداء استعلام ملف التعريف في قاعدة بيانات Azure ل MySQL - خادم مرن باستخدام EXPLAIN

ينطبق على: قاعدة بيانات Azure ل MySQL - خادم واحد قاعدة بيانات Azure ل MySQL - خادم مرن

هام

قاعدة بيانات Azure لخادم MySQL الفردي على مسار الإيقاف. نوصي بشدة بالترقية إلى قاعدة بيانات Azure لخادم MySQL المرن. لمزيد من المعلومات حول الترحيل إلى خادم Azure Database for MySQL المرن، راجع ما الذي يحدث لقاعدة بيانات Azure لخادم MySQL الفردي؟

تعد EXPLAIN أداة مفيدة يمكن أن تساعدك على تحسين الاستعلامات. يمكنك استخدام عبارة EXPLAIN للحصول على معلومات حول كيفية تشغيل عبارات SQL. يوضح المثال التالي الإخراج من تشغيل عبارة EXPLAIN.

mysql> EXPLAIN SELECT * FROM tb1 WHERE id=100\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 995789
     filtered: 10.00
        Extra: Using where

في هذا المثال، قيمة المفتاح هي NULL، ما يعني أن خادم Azure Database for MySQL المرن لا يمكنه تحديد موقع أي فهارس محسنة للاستعلام. ونتيجة لذلك، يقوم بإجراء فحص جداول كامل. لنحسن هذا الاستعلام عن طريق إضافة فهرس على عمود المعرف، ثم قم بتشغيل عبارة EXPLAIN مرة أخرى.

mysql> ALTER TABLE tb1 ADD KEY (id);
mysql> EXPLAIN SELECT * FROM tb1 WHERE id=100\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: ref
possible_keys: id
          key: id
      key_len: 4
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL

الآن، يظهر الإخراج أن خادم Azure Database for MySQL المرن يستخدم فهرسا للحد من عدد الصفوف إلى 1، ما يؤدي إلى تقصير وقت البحث بشكل كبير.

فهرس التغطية

يتضمن فهرس التغطية جميع أعمدة الاستعلام، ما يقلل من استرداد القيمة من جداول البيانات. توضح عبارة GROUP BY التالية والإخراج ذي الصلة ذلك.

mysql> EXPLAIN SELECT MAX(c1), c2 FROM tb1 WHERE c2 LIKE '%100' GROUP BY c1\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 995789
     filtered: 11.11
        Extra: Using where; Using temporary; Using filesort

يظهر الإخراج أن خادم Azure Database for MySQL المرن لا يستخدم أي فهارس، لأن الفهارس المناسبة غير متوفرة. يظهر الإخراج أيضا استخدام مؤقت؛ استخدام filesort، الذي يشير إلى أن خادم Azure Database for MySQL المرن ينشئ جدولا مؤقتا لتلبية عبارة GROUP BY .

لا يحدث إنشاء فهرس إلا في العمود c2 أي فرق، ولا يزال خادم Azure Database for MySQL المرن بحاجة إلى إنشاء جدول مؤقت:

mysql> ALTER TABLE tb1 ADD KEY (c2);
mysql> EXPLAIN SELECT MAX(c1), c2 FROM tb1 WHERE c2 LIKE '%100' GROUP BY c1\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 995789
     filtered: 11.11
        Extra: Using where; Using temporary; Using filesort

في هذه الحالة، يمكنك إنشاء فهرس مغطى على كل من c1 وc2 عن طريق إضافة قيمة c2 مباشرةً في الفهرس، مما سيؤدي إلى التخلص من المزيد من البحث عن البيانات.

mysql> ALTER TABLE tb1 ADD KEY covered(c1,c2);
mysql> EXPLAIN SELECT MAX(c1), c2 FROM tb1 WHERE c2 LIKE '%100' GROUP BY c1\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: index
possible_keys: covered
          key: covered
      key_len: 108
          ref: NULL
         rows: 995789
     filtered: 11.11
        Extra: Using where; Using index

كما يظهر إخراج EXPLAIN أعلاه، يستخدم خادم Azure Database for MySQL المرن الآن الفهرس المغطى ويتجنب الاضطرار إلى إنشاء جدول مؤقت.

الفهرس المجمع

يتكون الفهرس المجمع من قيم من أعمدة متعددة ويمكن اعتباره صفيفاً من الصفوف التي يتم فرزها حسب قيم تسلسل الأعمدة المفهرسة. يمكن أن يكون هذا الأسلوب مفيداً في عبارة GROUP BY.

mysql> EXPLAIN SELECT c1, c2 from tb1 WHERE c2 LIKE '%100' ORDER BY c1 DESC LIMIT 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 995789
     filtered: 11.11
        Extra: Using where; Using filesort

يقوم خادم Azure Database for MySQL المرن بإجراء عملية فرز ملفات بطيئة إلى حد ما، خاصة عندما يكون عليها فرز العديد من الصفوف. لتحسين هذا الاستعلام، قم بإنشاء فهرس مجمع على كلا العمودين اللذين يتم فرزهما.

mysql> ALTER TABLE tb1 ADD KEY my_sort2 (c1, c2);
mysql> EXPLAIN SELECT c1, c2 from tb1 WHERE c2 LIKE '%100' ORDER BY c1 DESC LIMIT 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb1
   partitions: NULL
         type: index
possible_keys: NULL
          key: my_sort2
      key_len: 108
          ref: NULL
         rows: 10
     filtered: 11.11
        Extra: Using where; Using index

يظهر إخراج عبارة EXPLAIN الآن أن خادم Azure Database for MySQL المرن يستخدم فهرسا مدمجا لتجنب الفرز الإضافي حيث تم فرز الفهرس بالفعل.

الخاتمة

يمكنك زيادة الأداء بشكل ملحوظ باستخدام EXPLAIN مع أنواع مختلفة من الفهارس. لا يعني وجود فهرس على جدول بالضرورة أن خادم Azure Database for MySQL المرن يمكنه استخدامه للاستعلامات الخاصة بك. تحقق دائماً من صحة افتراضاتك باستخدام EXPLAIN وقم بتحسين استعلاماتك باستخدام الفهارس.

الخطوات التالية

  • للعثور على إجابات النظراء لأسئلتك الأكثر أهمية أو لنشر سؤال أو الإجابة عليه، تفضل بزيارة Stack Overflow.