النتائج 1 إلى 9 من 9

الموضوع: أحصل على أفضل أداء من قاعدى البيانات MYSQL

  1. #1

    أحصل على أفضل أداء من قاعدى البيانات MYSQL



    بسم الله الرحمن الرحيم

    السلام عليكم ورحمة الله وبركاته .

    اخوانى الاعزاء قراء وأعضاء موقع سوالف سوفت لطالما وجدت الكثير من الاسئلة والموضوعات التى تدور حول كفاءة قاعدة البيانات MYSQL واستخدامها فى المواقع والتطبيقات الكبيرة !

    لذا قررت باذن الله طرح هذا الموضوع وفتح باب المناقشة أمام الجميع !

    وأحب أن أنوه أن ما سأكتبه هنا من معلومات هو خليط من خبراتى الشخصية ومعلومات جمعتها من المواقع الأجنبية أو حتى من مناقشات اخوانى العرب هنا أو فى بعض الأماكن الأخرى !

    هذا الموضوع مفتوح للمناقشة والتعديل مع امكانية النقل والتعديل لأى مكان (لن أتحدث فى معضلة الملكية الفكرية فهذا الامر سأتركه تماما لاخلاقيات الناقل )


    هناك بعض الالفاظ المترجمة والتى ربما لن تعجب بعض الاخوة (نظرا لضعفها وابتعادها عن أصل الكلمة الانجليزية) لذا سأرفق المصطلح الانجليزى للكلمة المترجمة كلما أمكن

    بسم الله نبدأ

    كما نعلم جميعا أن العمليات القائمة على قاعدة البيانات وخاصة فى التطبيقات الكبيرة هى المشكلة الأساسية ليس فقط لمديرى قواعد البيانات ولكن للمطورين أيضا

    فيجب على المبرمج مراعاة التصميم الجيد لقاعدة البيانات وكتابة استعلامات محسنة لضمان الحصول على افضل نتائج !

    فى هذا الجزء من الموضوع سأعرض بعض النقاط التى يجب مراعاتها حتى تحصل على أفضل كفاءة فى مواقعك باذن الله

    1. حسن استعلاماتاك لتعمل مع الذاكرة الطيارة للاستعلامات (Optimize Your Queries For the Query Cache)
      معظم مخدمات قواعد البيانات MYSQL لديها خاصية Query Cache مفعلة واذا كنت لا تعرف ماهى هذه الخاصية فجرب القيام باستعلام على قاعدة البيانات ثم قم بتكراره مرة أخرى ستجد المرة الثانية أسرع بكثير من الأولى وذلك لاستخدامه Query Cache

      وهناك الكثير منا من يقوم باستخدام دوال MYSQL للتعامل مع الوقت والتاريخ فى استعلاماته دون أن يعلم أن ذلك سيعطل الخاصية المذكورة
      مثال :
      كود 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'"); 
      والسبب أن الاستعلام الأول يحتوى على دالة CURDATE وهنا يعتبر MYSQL أن هذا الاستعلام متجدد لأن هذه الدالة قد ترجع قيما مختلفة مثلها مثل باقى دوال الوقت الخاصة ب MYSQL مثل NOW () و غيرها لذا اعتقد أن اضافة سطر PHP واحد قد يعنى توفير الاف الاستعلامات المرهقة لقاعدة بياناتك (حسب عدد زوارك )

    2. استخدم limit 1 عندما تريد الناتج صفا واحدا !
      فى بعض الاحيان عندما تستعلم من قاعدة بياناتك وأنت تعرف أن الناتج سيكون صفا واحدا فالافضل هو استخدام هذه الخاصية والسبب بافتراض أن لديك 100 ألف مستخدم وتريد تسجيل دخول أحدهم فعند اضافة هذه الخاصية سيقوم مخدم قاعدة البيانات بالتوقف فور الحصول عليه (تخيل أن هذا العضو هو العضو رقم 10 فى قاعدة البيانات بدون هذه الخاصية سيستمر المخدم الى نهاية الجدول على الرغم من حصوله على الناتج المطلوب )
    3. خاصية الإندكس Index استخدامها مع الحقول التى تستخدمها فى البحث !
      قد يخفى على البعض هذه الخاصية وقد يقتصر استخدامها لدى البعض على حقول المفاتيح الأساسية فقط ! (باختصار هذه الخاصية تعمل على تخزين الحقل المطلوب فى ذاكرة منفصلة حتى يتسنى لمحرك قاعدة البيانات من الوصول اليه بسرعة دون الحاجة الى الدخول الى الجدول )
      ولكن هذه الخاصية يجب أن تستخدم مع جميع الحقول التى تستخدمها فى البحث فهى تقريبا تقوم بتسريع الاستعلام 300 % تقريبا !




    سأكتفى بهذا القدر الان على أن أكمل لاحقا باذن الله







  2. #2
    عضو نشيط
    تاريخ التسجيل
    Feb 2008
    المشاركات
    281


    ماهى الحلول مع البحث انا ارى ان مع البحث index تكون بلا جدوى باليت لو تتطرق لحلول البحث,
    بارك الله فيك اخى الكريم فعلآ موضوع هام






  3. #3
    عضو نشيط
    تاريخ التسجيل
    Apr 2010
    المشاركات
    208


    بارك الله فيك
    ---------------
    لم استوعب كثيرا الموضوع بحكم اني لست مبرمجا او خبيرا ب mysql
    لكن عندي سؤال بسيط ان تكرمت بالاجابة عليه اكن لك شاكرا:

    ما الافضل لمنتدى متوسط يستخدم mybb :

    هل innoDB او MYISAM؟

    وبوركت.






  4. #4


    جزاكم الله خيرا اخوانى

    بإذن الله سأتطرق لأمور البحث فى هذا الموضوع

    اخى الكريم بشير شكري

    مبدئيا ما هو MYISAM و innoDB ؟
    كلاهما محركا قواعد بيانات تحديدا هما أشهر محركى قواعد بيانات بالنسبة لقواعد البيانات مفتوحة المصدر
    فكما نعلم أن محرك التخزين فى قواعد البيانات هو المحرك المسئول عن تخزين واسترجاع البيانات من قواعد البيانات وعلى الرغم من أن معظمنا عند انشاء جدول لا يقوم باختيار محرك معين بل يتركه المحرك الافتراضى لقاعدة البيانات

    الا انه لا يوجد ما يسمى ب -الحل الأفضل أو المحرك اﻷفضل - حيث أن كل تصميم واستخدام لقاعدة البيانات له ما يناسبه

    ولكى تقرر ما هو الأفضل سأدرج شرحا بسيطا وسريعا لكلا المحركين + مقارنة سريعة بينهما ولك القرار

    أولا : محرك MYISAM

    - هذا المحرك مبنى على محرك قديم يدعى ISAM الا نه تم تدعيمه وتزويده بمزايا قوية .
    - يقوم هذا المحرك بتخزين قاعدة الجداول على القرص فى ثلاث ملفات
    - الملف الأول هيكل الجدول
    - الملف الثانى البيانات
    - الملف الثالث INDEXES
    - الحد الأقصى المسموح به من الصفوف : 4.295E+09 أى 4.295 * 10 أس 9 (1 وبجواره 10 أصفار) - تقريبا
    والحد الأقصى من INDEXES للجدول الواحد 64

    - الحقول من نوع text/Blob يمكن أرشفتها بشكل كامل Fully index مما يعنى تحسين عملية البحث فى هذه الحقول بشكل كبير .

    - يمكنك الحصول على المزيد من المعلومات التقنية عن هذا المحرك من هذه الصفحة http://dev.mysql.com/doc/refman/5.0/...ge-engine.html

    ثانيا : المحرك innoDB
    - هذا المحرك أحدث من MYISAM ( اى تم تطويره بعده وليس أحدث فى الامكانيات ) لذا تجد بعد التخوف من استخدامه لاعتقاد البعض بعدم ضمان كفائته .
    - هذا المحرك يحتوى على خاصية Row-Locking أو قفل الصف بمعنى عند انشغال query بتحديث صف معين فى جدول فانه بامكان query اخر تحديث صف اخر فى نفس الجدول فى نفس الوقت وهو ما يعطى سماحية أكبر لاستخدام الكثير من الاعضاء استخدام نفس الجدول فى نفس الوقت .

    - من مزايا هذا المحرك أيضا هو امكانية التحقق من شروط المفتاح الأجنبى (foreign key constraints )
    بمعنى : انه يسمح للمبرمج من التأكد من صلاحية بيانات متعلقة ببيانات فى جدول اخر عند تحديثها .
    على سبيل المثال :
    لنفرض أن لديك جدول يحتوى على المؤلفين وجدول اخر يحتوى على الكتب ولا يمكنك اضافة كتاب الا اذا كان له مؤلف فهذه الخاصية تعمل على ذلك وايضا على العكس لا يمكنك حذف مؤلف مرتبط بكتب فى جدول الكتب .
    - بسبب خاصية row-locking فانه يمكن القول بان innoDB تزدهر أكثر فى التطبيقات المشهورة بالتحميل الزائد (من حيث عدد Query فى نفس الوقت )

    ثالثا : المقارنة
    فى معظم الأحيان سيكون MyISAM أسرع من innoDB فى ظروف العمل العادية كما انه المحرك الافتراضى الذى قام مطورو MYSQL باختياره كمحرك افتراضى عند عدم قيام المبرمج بتغييره الى محرك اخر .

    - على الرغم من هذا فإن خاصية row-locking فى المحرك innoDb ستكون حافزا قويا لاستخدامه فى الجداول التى تتميز بكثافة الاستعلامات عليها مثل جداول البحث (الجداول التى تقوم بالبحث فيها دائما) أو جداول السجلات (logs) ماعدا ذلك فان MYISAM ستكون أنسب فى أغلب الأحيان .

    اخيرا اذا كنت تريد اتخاذ قرار اى محرك تستخدم فانظر الى الاسئلة والإجابة .

    هل العمليات على جدولك من حيث الاضافة والحذف والتحديث ستكون أكثر بكثيييير من القراءة ؟ INNODB
    - هل تريد دعم خاصية البحث فى حقل نصى كامل ؟ MYISAM
    - هل تفضل / تتطلب قاعدة بيانات علائقية (relational database) ؟ INNODB
    - هل مساحة القرص أو RAM مشكلة بالنسبة لك ؟ MYISAM
    - لديك شك ؟ MYISAM

    وأخيرا لا يوجد فائز منهما

    فقط تذكر انه من الممكن الدمج بين كلا المحركين فى جداول قاعدة بيانات واحدة ولكن اذا حدثت لديك مشكلة عند اجراء ربط بين جدولين بمحركين مختلفين (JOIN) فقم باختيار نفس المحرك لكليهما .


    للمزيد من القراءة

    مقارنة بين MYISAM و INNODB ومحرك اخر يدعى FALCON

    MySQL Manual for INNODB


    MySQL manual for MyISAM


    MySQL Manual For Storing Engines

    طبعا أدعو جميع اخوانى الاعضاء المشاركة بأى معلومة تفيد فى هذا المجال حتى نثرى الموضوع ليكون مرجعا شاملا لمن يبحث عن المعلومة فى هذا المجال .






  5. #5
    عضو فعال
    تاريخ التسجيل
    Jul 2008
    المشاركات
    1,516


    السلام عليكم

    شكراً على المعلومات ...
    وأتمنى منك أن تجمعها كلها في موضوع متعاقب أو مدونة ...

    شكراً لك





    __________________
    أحب سوالف ولا احب الجدليين!
    اسماء اولاد وبنات http://muslim-names.us
    1000 مزاد http://1000mazad.com
    موقع نكت سعوديةhttp://arab-jokes.net

  6. #6


    massalha وعليكم السلام ورحمة الله وبركاته

    دعنا أولا نثرى الموضوع ثم بعد ذلك نجد طريقة جيدة لأرشفته حتى يكون متاحا للجميع بصورة جيدة

    شكرا لمتابعتك ومرورك الكريم






  7. #7
    عضو نشيط جدا
    تاريخ التسجيل
    Apr 2010
    المشاركات
    412


    عمل رائع اخي , بالتوفيق لك , واتمني اثراء الموضوع , وعندي سؤال مهم جداً واتمني ان اجد حله عندك

    السؤال اخي الكريم , هل وجود جدول كبير مثلاً جدول اخبار , فيه مليون موضوع مثلاً

    واريد الوصول لموضوع برقم ال id الخاص به

    كيف يعمل مثل ذلك الأستعلام ؟ اعني ماهي أليه عملة , هل سيقوم بوضع كل بيانات الجدول في الذاكرة مثلاً ويبحث عن ال row المطلوب ؟ او كيف , اريد فعلاً ان افهم ذلك الامر

    تحياتي واسف إن كان بكلامي لبس





    __________________
    إصبر على كيد الحسود فإن صبرك قاتله ...
    أرسل خريطة موقعك لمحركات البحث

  8. #8


    جزاك الله خيرا اخى الكريم
    وبالنسبة لسؤالك فهو سؤال جميل جدا ( وسأحاول قدر الإمكان الاجتهاد فى إجابته على قدر علمى)

    كما تعلم أخى الكريم فقاعدة البيانات MYSQL ليست مغلقة المصدر لذا فان جميع الخوارزميات المدمجة بها معلنة ومعروفة لمن يريد البحث والتعمق فى هذا المجال (مثلا لو أحببت أن تقوم ببناء نموذج قاعدة البيانات الخاص بك )
    وأفضل مكان على حد علمى يمكنك الحصول على معلومات عن مثل هذه التكنولوجيا هو هنا

    MySql Forge

    فالموقع كما يطلقون عليه مصنع الحداد (التشكيل) الخاص ب MYSQL والرابط السابق تحديدا يوضح كيفية عمل واستخدام بعض الخوارزميات فى MYSQL مثل الترتيب وغيره .

    من هنا أخى الكريم أنقل لك ما فهمته عن عملية استخراج البيانات من قاعدة البيانات MYSQL (أكرر على حسب ما فهمته)

    أولا يقوم محرك قاعدة البيانات بالكشف اذا ما كنت قد أجريت هذا الاستعلام سابقا (منذ فترة قليلة ) فانه يعيد اليك بيانات الاستعلام من الذاكرة مباشرة دون الذهاب الى قاعدة البيانات على القرص الصلب .

    ثانيا : ماذا اذا لم يكن الاستعلام موجود ؟ فانه يقوم بترتيبه ومعالجته بمعنى أنه قد تكون تستخدم أحد الدوال الخاصة ب MYSQL فى استعلامك أو ما الى ذلك .

    ثالثا : يقوم بتنفيذ الاستعلام عن طريق المقارنة (بمعنى انه فى الحالة الخاصة بانك تريد استرجاع استعلام ب id الخاص بالخبر ) فانه يقوم بمقارنة جميع id's فى الجدول حتى يحصل على الخبر المرغوب !

    مهلا هنا نقطة مهمة وهى هل يتوقف MYSQL عن هذه المقارنة اذا وجد الصف الذى يحمل id الخاص بى
    والاجابة : كلا لن يتوقف الا فى حالة واحدة وهى تحديد limit للاستعلام الخاص بك وهذه هى النقطة رقم 2 فى أول مشاركة لى فى هذا الموضوع

    أخيرا أتمنى من الله أن أكون قد أوصلت لك قدر ولو بسيط من الاستفادة وبانتظار مشاركات باقى الأخوة






  9. #9
    عضو نشيط جدا
    تاريخ التسجيل
    Apr 2010
    المشاركات
    412


    جزاك الله خيرا اخى الكريم
    وبالنسبة لسؤالك فهو سؤال جميل جدا ( وسأحاول قدر الإمكان الاجتهاد فى إجابته على قدر علمى)

    كما تعلم أخى الكريم فقاعدة البيانات MYSQL ليست مغلقة المصدر لذا فان جميع الخوارزميات المدمجة بها معلنة ومعروفة لمن يريد البحث والتعمق فى هذا المجال (مثلا لو أحببت أن تقوم ببناء نموذج قاعدة البيانات الخاص بك )
    وأفضل مكان على حد علمى يمكنك الحصول على معلومات عن مثل هذه التكنولوجيا هو هنا

    MySql Forge

    فالموقع كما يطلقون عليه مصنع الحداد (التشكيل) الخاص ب MYSQL والرابط السابق تحديدا يوضح كيفية عمل واستخدام بعض الخوارزميات فى MYSQL مثل الترتيب وغيره .

    من هنا أخى الكريم أنقل لك ما فهمته عن عملية استخراج البيانات من قاعدة البيانات MYSQL (أكرر على حسب ما فهمته)

    أولا يقوم محرك قاعدة البيانات بالكشف اذا ما كنت قد أجريت هذا الاستعلام سابقا (منذ فترة قليلة ) فانه يعيد اليك بيانات الاستعلام من الذاكرة مباشرة دون الذهاب الى قاعدة البيانات على القرص الصلب .

    ثانيا : ماذا اذا لم يكن الاستعلام موجود ؟ فانه يقوم بترتيبه ومعالجته بمعنى أنه قد تكون تستخدم أحد الدوال الخاصة ب MYSQL فى استعلامك أو ما الى ذلك .

    ثالثا : يقوم بتنفيذ الاستعلام عن طريق المقارنة (بمعنى انه فى الحالة الخاصة بانك تريد استرجاع استعلام ب id الخاص بالخبر ) فانه يقوم بمقارنة جميع id's فى الجدول حتى يحصل على الخبر المرغوب !

    مهلا هنا نقطة مهمة وهى هل يتوقف MYSQL عن هذه المقارنة اذا وجد الصف الذى يحمل id الخاص بى
    والاجابة : كلا لن يتوقف الا فى حالة واحدة وهى تحديد limit للاستعلام الخاص بك وهذه هى النقطة رقم 2 فى أول مشاركة لى فى هذا الموضوع

    أخيرا أتمنى من الله أن أكون قد أوصلت لك قدر ولو بسيط من الاستفادة وبانتظار مشاركات باقى الأخوة
    جزاك الله خيراً على الرد والأهتمام اخي الكريم , سأقرا الصفحة التي اعطيتني اياها وجعلها الله في ميزان حسناتك

    لا تعلم اخي الكريم كم كان هذا الموضوع يشغل بالي شكراً جزيلاً





    __________________
    إصبر على كيد الحسود فإن صبرك قاتله ...
    أرسل خريطة موقعك لمحركات البحث





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض