بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته .
اخوانى الاعزاء قراء وأعضاء موقع سوالف سوفت لطالما وجدت الكثير من الاسئلة والموضوعات التى تدور حول كفاءة قاعدة البيانات MYSQL واستخدامها فى المواقع والتطبيقات الكبيرة !
لذا قررت باذن الله طرح هذا الموضوع وفتح باب المناقشة أمام الجميع !
وأحب أن أنوه أن ما سأكتبه هنا من معلومات هو خليط من خبراتى الشخصية ومعلومات جمعتها من المواقع الأجنبية أو حتى من مناقشات اخوانى العرب هنا أو فى بعض الأماكن الأخرى !
هذا الموضوع مفتوح للمناقشة والتعديل مع امكانية النقل والتعديل لأى مكان (لن أتحدث فى معضلة الملكية الفكرية فهذا الامر سأتركه تماما لاخلاقيات الناقل )
هناك بعض الالفاظ المترجمة والتى ربما لن تعجب بعض الاخوة (نظرا لضعفها وابتعادها عن أصل الكلمة الانجليزية) لذا سأرفق المصطلح الانجليزى للكلمة المترجمة كلما أمكن
بسم الله نبدأ
كما نعلم جميعا أن العمليات القائمة على قاعدة البيانات وخاصة فى التطبيقات الكبيرة هى المشكلة الأساسية ليس فقط لمديرى قواعد البيانات ولكن للمطورين أيضا
فيجب على المبرمج مراعاة التصميم الجيد لقاعدة البيانات وكتابة استعلامات محسنة لضمان الحصول على افضل نتائج !
فى هذا الجزء من الموضوع سأعرض بعض النقاط التى يجب مراعاتها حتى تحصل على أفضل كفاءة فى مواقعك باذن الله
- حسن استعلاماتاك لتعمل مع الذاكرة الطيارة للاستعلامات (Optimize Your Queries For the Query Cache)
معظم مخدمات قواعد البيانات MYSQL لديها خاصية Query Cache مفعلة واذا كنت لا تعرف ماهى هذه الخاصية فجرب القيام باستعلام على قاعدة البيانات ثم قم بتكراره مرة أخرى ستجد المرة الثانية أسرع بكثير من الأولى وذلك لاستخدامه Query Cache
وهناك الكثير منا من يقوم باستخدام دوال MYSQL للتعامل مع الوقت والتاريخ فى استعلاماته دون أن يعلم أن ذلك سيعطل الخاصية المذكورة
مثال :
والسبب أن الاستعلام الأول يحتوى على دالة CURDATE وهنا يعتبر MYSQL أن هذا الاستعلام متجدد لأن هذه الدالة قد ترجع قيما مختلفة مثلها مثل باقى دوال الوقت الخاصة ب MYSQL مثل NOW () و غيرها لذا اعتقد أن اضافة سطر PHP واحد قد يعنى توفير الاف الاستعلامات المرهقة لقاعدة بياناتك (حسب عدد زوارك )كود PHP:
// query cache does NOT work
$r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");
// query cache works!
$today = date("Y-m-d");
$r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");
- استخدم limit 1 عندما تريد الناتج صفا واحدا !
فى بعض الاحيان عندما تستعلم من قاعدة بياناتك وأنت تعرف أن الناتج سيكون صفا واحدا فالافضل هو استخدام هذه الخاصية والسبب بافتراض أن لديك 100 ألف مستخدم وتريد تسجيل دخول أحدهم فعند اضافة هذه الخاصية سيقوم مخدم قاعدة البيانات بالتوقف فور الحصول عليه (تخيل أن هذا العضو هو العضو رقم 10 فى قاعدة البيانات بدون هذه الخاصية سيستمر المخدم الى نهاية الجدول على الرغم من حصوله على الناتج المطلوب )- خاصية الإندكس Index استخدامها مع الحقول التى تستخدمها فى البحث !
قد يخفى على البعض هذه الخاصية وقد يقتصر استخدامها لدى البعض على حقول المفاتيح الأساسية فقط ! (باختصار هذه الخاصية تعمل على تخزين الحقل المطلوب فى ذاكرة منفصلة حتى يتسنى لمحرك قاعدة البيانات من الوصول اليه بسرعة دون الحاجة الى الدخول الى الجدول )
ولكن هذه الخاصية يجب أن تستخدم مع جميع الحقول التى تستخدمها فى البحث فهى تقريبا تقوم بتسريع الاستعلام 300 % تقريبا !
سأكتفى بهذا القدر الان على أن أكمل لاحقا باذن الله