في الآونة الأخيرة، قمت باستخدام نظام إدارة قواعد البيانات MySQL لمعالجة بعض الجداول التي تحتوي على أكثر من 40 مليون سجل. يتمثل السيناريو التفصيلي في وجود جدولين بنفس الهيكل يحتوي كل منهما على أكثر من 40 مليون سجل لأسعار المنتجات. يهدف هدفي إلى العثور على عدد المنتجات التي تظهر في كلتا الأيام، وقد استخدمت الاستعلام التالي:
sqlSELECT count(*) FROM t1 a, t2 b WHERE a.product_id = b.product_id;
وقد اتضح أن هذا الاستعلام يأخذ وقتًا طويلاً يتجاوز نصف ساعة للحصول على النتائج. هل هناك طريقة لتحسين أداء هذا الاستعلام؟
لتحسين أداء هذا الاستعلام، يمكنك اتباع بعض الخطوات والتقنيات المحسنة. أولاً وقبل كل شيء، يفضل تحسين بنية الجداول والفهارس. يمكنك التأكد من وجود فهارس فعالة على عمود product_id
في كل جدول، وذلك لتسريع عمليات البحث. يمكنك استخدام الفهارس المركبة لتحسين أداء الاستعلامات التي تشمل أكثر من عمود في البحث.
sqlCREATE INDEX idx_product_id_date ON t1 (product_id, date);
CREATE INDEX idx_product_id_date ON t2 (product_id, date);
ثم، يمكنك استخدام الاستعلام الذي يستفيد من هذه الفهارس:
sqlSELECT count(*) FROM t1 a INNER JOIN t2 b ON a.product_id = b.product_id AND a.date = b.date;
باستخدام الفهارس بشكل فعال، يجب أن تلاحظ تحسينًا في أداء الاستعلام. إذا كنت لا تزال تواجه مشكلات في الأداء، يمكنك النظر إلى تحسين إعدادات قاعدة البيانات مثل حجم الذاكرة المخصصة وحجم التخزين المؤقت.
المزيد من المعلومات
لتحسين أداء الاستعلامات في بيئة MySQL، يمكنك اعتبار بعض النقاط الإضافية:
-
تحسين إعدادات MySQL:
- قم بمراجعة وتحسين إعدادات
my.cnf
لتناسب متطلباتك الخاصة. ضع في اعتبارك تعيين قيم مناسبة لمعاملات مثلinnodb_buffer_pool_size
لضمان استخدام فعال للذاكرة. - يمكنك فحص وتحسين إعدادات أخرى مثل
innodb_log_file_size
وinnodb_flush_log_at_trx_commit
وغيرها.
- قم بمراجعة وتحسين إعدادات
-
استخدام الفهارس بحكمة:
- قد تحتاج إلى فهارس إضافية على العمود
date
إذا كنت تنفذ استعلامات تشمل تصفية حسب التاريخ بشكل كبير. - تجنب إضافة فهارس غير ضرورية، حيث قد تؤدي الفهارس الزائدة إلى تباطؤ في الإدخال والتحديث.
- قد تحتاج إلى فهارس إضافية على العمود
-
تقسيم البيانات:
- قم بدراسة إمكانية تقسيم الجداول إلى جداول فرعية أصغر باستخدام القدرة على التقسيم (Partitioning) في MySQL. هذا يمكن أن يساعد في تحسين أداء الاستعلامات الكبيرة.
-
استخدام البيانات المخفضة:
- يمكنك استخدام الأوامر مثل
LIMIT
للحصول على عدد محدد من النتائج، وهو خاصة إذا لم يكن من الضروري استرجاع كل النتائج في كل مرة.
- يمكنك استخدام الأوامر مثل
-
تحسين الاستعلام:
- قم بفحص خطط التنفيذ للاستعلام باستخدام
EXPLAIN
لتحديد الجداول التي تتم المسح عليها وما إذا كانت الفهارس تستخدم بشكل صحيح.
- قم بفحص خطط التنفيذ للاستعلام باستخدام
-
تحديث MySQL:
- تأكد من استخدام أحدث إصدار من MySQL، حيث قد تحتوي الإصدارات الحديثة على تحسينات في الأداء.
باتخاذ هذه الإجراءات، يمكنك تحسين أداء استعلامات MySQL التي تعالج جداول كبيرة مثل تلك التي تحتوي على 40 مليون سجل.