أداء استعلام ملف التعريف في قاعدة بيانات 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.
الملاحظات
https://aka.ms/ContentUserFeedback.
قريبًا: خلال عام 2024، سنتخلص تدريجيًا من GitHub Issues بوصفها آلية إرسال ملاحظات للمحتوى ونستبدلها بنظام ملاحظات جديد. لمزيد من المعلومات، راجعإرسال الملاحظات وعرضها المتعلقة بـ