الدكتور نت
السلام عليكم
منذ العام 1999م و نحن نحاول الارتقاء بالمصمم و المطور العربي عبر إضافة دروس و مقالات و دروات لتساعده على إنشاء و تطوير موقعه . لو كنت أحد هؤلاء و أحببت مساعدتنايمكننا أن ندلك على عدد من الأمور التي يمكنك القيام بها لمساعدتنا اضغط هنا و أقرأ أكثر عن الموضوع ..
Mysql : تحسين الأداء optimization
بقلم: الدكتور نت
مواضيع أخرى لنفس المحرر
الدكتور نت
◄ حول الموضوع
وصف الموضوع
أفكار و مقترحات تساعد المبرمجين على الحصول على افضل أداء و تجنب مشاكل بطء النظام و توقفه .
الأوسمة :
mysql| optimize| قواعد بيانات| وقت| أداء| تحديث| تحسين| جدوال| دوال
في التصنيفات :تصميم و تطوير المواقع, قواعد البانات Mysql
هناك عدد من الأفكار التي يمكنك تطبيقها في عند تصميم برنامج لتحسين أداء و زيادة سرعة البرنامج .
استخدم أمر Explain
متى ما بدأت باستخدامه لن تقوم باعتماد أي استعلام من غير تجربته مع الامر explain. الأمر Explain يقوم بتفصيل الطريقة التي سينفذ بها الاستعلام و كيف سيتم سحب النتائج . قم بوضع الأمر explain قبل الاستعلام مثلا لو كان استعلامك التالي
select *from table
ضع الامر قبل الاستعلام كالتالي
EXPLAIN select * from table
سيظهر لك جدول النتائج يحتوي على التالي :
- id : رقم تعريفي للإستعلام و هو رقم تسلسلي.
- select_type : نوع الاستعلام سيكون أحد التالي :
- SIMPLE : استعلام بسيط لا يستخدم أي من طرق اتحاد أو اندماج الاستعلامات .
- PRIMARY :استعلام خارجي .
- UNION : استعلام ثاني أو تالي باستخدام الاتحاد
- DEPENDENT UNION : استعلام ثاني أو تالي باستخدام الاتحاد يعتمد على استعلام خارجي .
- UNION RESULT: نتائج اتحاد
- SUBQUERY: استعلام متفرع
- DEPENDENT SUBQUERY : أول استعلام في استعلام متفرع يعتمد على استعلام خارجي
- DERIVED : استخدام استعلام فرعي بعد From في الاستعلام الرئيسي
- UNCACHEABLE SUBQUERY : استعلام فرعي لا يمكن الاحتفاظ بنتائجة و بالتالي سيتم طلبه في عند طلب كل صف .
- table : اسم الجدول الذي سينفذ عليه الاستعلام
- type: نوع الدمج Join و سأذكرها في الأسفل من الأفضل إلى الاسوء من حيث المحافظة على موارد النظام .
- system : الجدول يحتوي على صف واحد فقط و هي استعلامات خاصة بالنظام مثلا تاريخ اليوم أو الوقت ..الخ
- const :صف واحد يعتمد على قيمة ثابتة .
- eq_ref: صف واحد من هذا الجدول مع كل مجموعة من الجدول السابق ( في حالات استعلام من أكثر من جدول ) . و هذه أفضل نتيجة يمكنك الحصول عليه على أرض الواقع .
- ref : كل النتائج المطابقة من هذا الجدول لكل مجموعة من الجدول السابق .
- Fulltext: عملية الدمج join تمت بواسطة فهرس من نوع Fulltext .
- ref_or_null : مشابهه بشكل كبير ل ref لكن بالإضافة لذلك فمحرك mysql يقوم بالبحث عن الصفوف التي تحتوي على null (فارغة ).
- index_merge :و هذا يدل على انه تم استخدام Index Merge optimization لمعالجة هذا الإستعلام .
- unique_subquery :الاستعلامات الفرعية التي تعتمد على المفتاح الرئيسي Primary key أو قيمة متفردة Unique .
- index_subquery :الإستعلامات الفرعية التي تعتمد على قيمة مفهرسة .
- range : فقط الصفوف في مجال معين تم اختيارها بواسطة معاملات المقارنة مثل <>=… الخ .
- index : هذا الإستعلام يقوم بعمل بحث كامل في فهارس الجدول .
- All : اسوء الانواع لو ظهرت لك في نتائج الاستعلام بدلها و ابحث عن طريقة افضل لان عملية البحث تتم في الجدول كامل و هذه سيؤثر على الأداء بشكل سلبي .
- Possiable keys : عرض ما هي الفهارس التي تم استخدامها .
- Keys : يعرض ما هو القيمة المفتاحية التي قرر استخدامها .
- key_len : طول القيمة المفتاحية .
- ref : ما هي الفهارس التي تم استخدامها .
- rows: عدد الصفوف التي تم التوصل لها
- extra : معلومات إضافية
SQL_CACHE
سيقوم mysql بالاحتفاط بنتائج الأستعلامات و بالتالي تخفيف الضغط على قاعدة البيانات و و سيتم إلغاء هذه النتائج المحتفظ بها و إنشاء نسخة جديدة في حال تم تعديل الجداول من إضافة و تحرير … الخ للتفعيل استخدم الأمر التالي
query_cache_type = 1 query_cache_size = 26214400
الرقم 26214400 يساوي 25mb يمكن أن يكون أي رقم تختاره للمساحة المتوفرة لتخزين النسخة .
SQL_NO_CACHE
و هو عكس الأمر السابق و عليك استخدم هذا الامر لمنع تخزين نسخة من النتائج مع الجدوال التي تحدث فيها عمليات إضافة و مسح و تعديل بشكل كبير و متكرر و بالتالي لا تستنفذ موارد النظام و يقوم النظام بإنشاء نسخة جديدة من النتائج و الإحتفاظ بها.
SQL_BUFFER_RESULT
الامر يقوم بوضع نتائج الاستعلام في جدول مؤقت و بالتالي تخفيف الضغط عن الجدول الأساسي .
استخدم optimize
لإعادة تنظيم الجداول خاصة بعد عمليات الحذف و التعديل الكبيرة .. يمكنك القيام بذلك من خلال phpmyadmin فالأمر موجود بين القوائم أو باستخدام
optimize tablename ;
حيث tablename هو اسم الجدول .
Slow Query Log
وهي خاصية في محرك mysql تمكنك من الكشف عن الاستعلامات التي استغرقت أكثر من الوقت المسموح به من قبل mysql . لو كتت تملك صلاحية الدخول إلى Mysqld يمكنك استخدام الأمر
--log-slow-queries[=file_name]
حيث filename هو اسم الملف الذي سيتم تخزين هذه البيانات فيه .
لو لم تحدد اسم الملف و استخدم الأمر بالشكل التالي
--log-slow-queries
سيتم تخزين البيانات في ملف باسم
host_name-slow.log
حيث host_name هو اسم المستضيف .
HIGH_PRIORITY
نستخدم هذا الأمر خلال الأستعلام نفسه لإعلام محرك mysql بأهمية هذا الأستعلام و ضرورة تنفيذة قبل أي استعلام آخر و إعاطائه أولية التنفيذ.
LOW_PRIORITY
و هو عكس السابق نستخدمة لإعطاء بعض الإستعلامات أولية تنفيذ دنيا و بالتالي ننظم عملية تنفيذ الأستعلامات .
SQL_BIG_RESULT
يمكنك استخدام هذا الأمر إذا كنت تستخدم استعلام يحتوي على Distinct و group by و تتوقع ان نتائج الإستعلام ستكون كبيرة و بالتالي يقوم mysql بإنشاء جدول مؤقت لزرع النتائج وترتيبه لتقليل الضغط على الذاكرة المؤقتة .
خاتمة
هناك أفكار أخرى مطروحة و لكني أرتأيت هنا أن أعرض أفكار موجهة للمبرمجين و مصممين النطم و ليس مديري قواعد البيانات.
تقييم الموضوع :
- اضيف
في 28 يوليو 2008 - التعليقات : [ 2 تعليقات ]
- الزوار : [ 1,172 قارئ ]
- هذا الموضوع مرخص وفق ترخيص Creative Commons.[ معلومات إضافية حول الترخيص بالعربية]









