فحص المخطط MySQL
هذه الصفحة هي وثائق PmaControl الأصلية. ويستخدم بنية فهرس عملية للعمل على تحسين MySQL، دون نسخ محتوى جهة خارجية أو الاعتماد على منتج خارجي.
الهدف
تبحث عمليات فحص المخطط عن الهياكل باهظة الثمن في الإنتاج: غياب الفهارس، والأعمدة كبيرة الحجم، والمفاتيح الأساسية المفقودة، وجداول وفهارس MyISAM التاريخية التي لم يتم استخدامها مطلقًا.
نقاط للتحقق
- جداول InnoDB بدون مفتاح أساسي.
- فهارس مكررة أو زائدة عن الحاجة إلى حد كبير.
- الأعمدة
VARCHARأوTEXTالمستخدمة في الفهارس الواسعة جدًا. - انضم إلى الأعمدة بأنواع أو مجموعات مختلفة.
- جداول كبيرة بدون استراتيجية أرشفة.
- القيود الرئيسية الخارجية غائبة عندما تكون النزاهة هي العمل.
استفسارات مفيدة
SELECT table_schema, table_name
FROM information_schema.tables t
WHERE engine = 'InnoDB'
AND table_schema NOT IN ('mysql', 'performance_schema', 'information_schema', 'sys')
AND NOT EXISTS (
SELECT 1
FROM information_schema.table_constraints c
WHERE c.table_schema = t.table_schema
AND c.table_name = t.table_name
AND c.constraint_type = 'PRIMARY KEY'
);
للتذكر
يربط فحص المخطط ذو الصلة كل حالة شاذة باستعلام أو خطة تنفيذ أو تكلفة تشغيلية قابلة للقياس.
جرد الأحجام والمحركات والمسؤولين
ابدأ بالجداول المهمة للأعمال والاستعلامات التي تصل إليها. سجّل الغرض وسياسة الاحتفاظ ومعدل الكتابة ونافذة الصيانة. تحدد بيانات المخطط المرشحين للفحص، لكنها لا تثبت مشكلة أداء. أعداد صفوف InnoDB وأحجامه تقديرات تُستخدم للترتيب لا للمحاسبة الدقيقة. تجنب العد الكامل المكلف لمجرد إظهار الجرد بدقة أكبر.
SELECT table_schema, table_name, engine, table_rows,
ROUND(data_length / 1024 / 1024, 1) AS data_mib,
ROUND(index_length / 1024 / 1024, 1) AS index_mib
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema NOT IN ('mysql', 'sys', 'performance_schema',
'information_schema')
ORDER BY data_length + index_length DESC
LIMIT 20;
مراجعة الفهارس المرشحة مقابل الحمل الفعلي
SELECT table_schema, table_name, redundant_index_name,
dominant_index_name
FROM sys.schema_redundant_indexes
WHERE table_schema NOT IN ('mysql', 'sys');
SELECT object_schema, object_name, index_name
FROM sys.schema_unused_indexes
WHERE object_schema NOT IN ('mysql', 'sys');
تتطلب عروض MySQL sys هذه تثبيت المخطط وتوافر القياس المناسب. الفهرس غير مستخدم فقط ضمن الحمل المرصود: ضمّن التقارير ومهام نهاية الشهر وقراءات النسخ والأدوار بعد التحويل. افحص التفرد واعتماد المفاتيح الأجنبية قبل الحذف. تداخل البادئات مرشح للمراجعة، لا أمراً تلقائياً بالحذف. في MySQL 8+ يمكن جعل الفهارس المؤهلة غير مرئية في اختبار مضبوط، لكنها تبقى ذات كلفة عند الكتابة.
فحص مسارات الوصول وتوافق الأعمدة
SELECT table_name, column_name, column_type, is_nullable,
character_set_name, collation_name
FROM information_schema.columns
WHERE table_schema = 'app'
ORDER BY table_name, ordinal_position;
EXPLAIN FORMAT=JSON
SELECT id, created_at
FROM app.orders
WHERE customer_id = 42
ORDER BY created_at DESC
LIMIT 20;
استبدل app.orders وأعمدته باستعلام فعلي ممثل. افحص المفاتيح المحتملة والمختار والصفوف المقدرة والفلاتر المتبقية والفرز. في المثال، فهرس يبدأ بـ (customer_id, created_at) مرشح للاختبار وليس وصفة عامة. طابق أنواع أعمدة الربط وإشارتها ومجموعات الأحرف وقواعد ترتيبها. قد تغير التحويلات الضمنية أو الدوال على الأعمدة المفهرسة مسار الوصول. تحقّق بمعاملات واقعية تشمل العملاء ذوي البيانات الكبيرة.
تصنيف نتائج فحص البنية
| المؤشر | كيفية التحقق | الخطوة التالية |
|---|---|---|
| غياب المفتاح الأساسي | تعريف الجدول وهوية الصفوف | اختيار مفتاح ثابت وتقييم كلفة إعادة البناء |
| فهرس زائد | التعريف والاعتمادات وتغطية الحمل | اختبار الإزالة قبل اعتماد DDL |
| أعمدة ربط غير متوافقة | الأنواع والترتيب والخطة الفعلية | التحقق من التحويل ودلالات التطبيق |
تحويل النتيجة إلى ترحيل مضبوط
- حفظ
SHOW CREATE TABLEوالاستعلامات التابعة والمفاتيح الأجنبية والخطة الأصلية. - تقدير مساحة القرص المؤقتة والمدة وانتظار أقفال البيانات الوصفية وأثر النسخ وفق DDL والإصدار المحددين. قد ينتظر DDL المتصل هذه الأقفال أيضاً.
- الاختبار ببيانات ممثلة ومقارنة زمن القراءة وكلفة الكتابة والحجم وصحة النتائج.
- تخطيط التراجع صراحةً: إعادة بناء فهرس محذوف تستغرق وقتاً، والتراجع عن المخطط قد يتطلب تحويل البيانات أو استعادتها.
متابعة التشخيص
- اربط كل نتيجة بـ ضبط الأداء وسجّلها في صفحة التقييم.