it-swarm.asia

تخزين قاعدة بيانات MySQL في الذاكرة

أواجه مشكلات مع موقع ويب يحتوي على 600 ميغابايت من قاعدة بيانات MySQL. الموقع بطيء جدا لاحظت أنه كلما كبرت قاعدة بيانات MySQL ، كلما كانت أبطأ. عندما كان حجمه 5 ميجا بايت ، كان الموقع سريعًا جدًا. عندما بدأ في النمو ، بدأ يصبح أبطأ وأبطأ ، والآن ، بسرعة 600 ميجابايت ، يكون بطيئًا جدًا ، حيث يستغرق حوالي 10 ثوانٍ لتحميل الصفحات.

راجعت العمليات العليا وليس لها علاقة بالحمولة العالية أو أي شيء. لا يتعلق الأمر حتى بـ IOPS لأنني اختبرت على محركات الأقراص الثابتة 7.2k rpm وأعطت نفس المشكلة الآن مع الاختبار مع محركات Intel 320 SSD ، لذلك لا أعتقد أنها تتعلق بطلبات بحث عالية أيضًا.

يستخدم الموقع Wordpress وهناك ما يقرب من 9 مكونات إضافية نشطة. قال الناس أنها قد تكون الإضافات ... حسنًا ربما ... ولكن الآن أريد فقط تخزين قاعدة البيانات بأكملها في الذاكرة وتود الحصول على المساعدة والتوجيه من أين تبدأ وكيف تفعل ذلك.

لدي 16 جيجابايت RAM و i5-2400 4 نوى بسرعة 3.1 جيجاهرتز. نظام التشغيل هو سنتوس 5.7

top - 07:23:57 up 9 days, 12:15, 0 users, load average: 0.09, 0.04, 0.05
Tasks: 162 total, 1 running, 161 sleeping, 0 stopped, 0 zombie
Cpu(s): 8.2%us, 1.0%sy, 0.0%ni, 90.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16367532k total, 3641628k used, 12725904k free, 612140k buffers
Swap: 1046520k total, 0k used, 1046520k free, 1538896k cached
11
grant tailor

لو كنت مكانك ، كنت سأغير جميع البيانات إلى InnoDB. منذ فترة طويلة ناقش تأمين الجدول/قفل الصف من قبل العديد. سأختار دائمًا InnoDB. ومع ذلك ، هناك سبب عميق آخر لاختيار InnoDB ... التخزين المؤقت .

في حين أن معظم الناس يتباهون بأن MyISAM أسرع للقراءة ، ينسى معظم الناس أن ذاكرة التخزين المؤقت الكثيرة لـ MyISAM ، والتي تسمى ذاكرة التخزين المؤقت الرئيسية (المعينة بواسطة key_buffer_size) ، تخزن فقط صفحات الفهرس من ملفات .MYI. فإنه لا يخزن صفحات البيانات. يبلغ الحد الأقصى الرسمي 4 جيجابايت في أنظمة 32 بت. 8 جيجابايت هي الأفضل كحد أقصى لـ 64 بت.

يقوم التخزين المؤقت لـ InnoDB بتخزين البيانات والفهرس في ذاكرة التخزين المؤقت. اعتمادًا على الخادم لديك ، يمكنك تخزين ما يصل إلى مجموعة البيانات بالكامل في ذاكرة الوصول العشوائي. يمكنك ضبط InnoDB لما يصل إلى 80٪ RAM و 10٪ لـ DB Conenctions ، وترك 10٪ لنظام التشغيل. هذا صحيح حتى بالنسبة لأنظمة التشغيل المختلفة .

لقد أوصيت بهذه الأشياء لـ Drupal بنجاح رائع (ينطبق على Wordpress أيضًا. لقد قدمت دعم DB للعملاء باستخدام WordPress. نفس التحسينات.

يمكنك دائمًا تكوين الذاكرة لـ InnoDB بشكل أكثر فعالية أنه يمكنك زيادة MyISAM. هناك دائما طريقة tweek InnoDB لتناسب احتياجات الأداء الخاصة بك . مع نمو بياناتك ، ستصبح في النهاية تصبح متطلبًا .

تحديث 2011-11-21 11:44 EST

إذا كانت مجموعة البيانات الكاملة صغيرة بما يكفي ، يمكنك تنفيذ استعلام SELECT على كل جدول لديك بعد بدء mysql مباشرة.

بالنسبة لجميع الجداول التي هي InnoDB و/أو MyISAM ، قم بتشغيل هذا الاستعلام:

SELECT DISTINCT
    CONCAT('SELECT ',ndxcollist,' FROM ',
    db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
    SELECT
        engine,table_schema db,table_name tb,index_name,
        GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
    FROM (
        SELECT
            B.engine,A.table_schema,A.table_name,
            A.index_name,A.column_name,A.seq_in_index
        FROM
            information_schema.statistics A INNER JOIN
            (SELECT engine,table_schema,table_name
            FROM information_schema.tables
            WHERE engine IN ('InnoDB','MyISAM')) B
            USING (table_schema,table_name)
        WHERE
            B.table_schema NOT IN ('information_schema','mysql')
            AND A.index_type <> 'FULLTEXT'
        ORDER BY
            table_schema,table_name,index_name,seq_in_index
        ) A
    GROUP BY
        table_schema,table_name,index_name
) AA
ORDER BY
    engine DESC,db,tb
;

سيؤدي هذا إلى إخراج كل استعلام SELECT ممكن تحتاج إلى تشغيله والذي سيستدعي جميع الفهارس التي سيتم الرجوع إليها. ضع هذا الاستعلام في ملف يسمى /root/MakeSelectQueriesToLoad.sql. قم بتشغيل البرنامج النصي وجمع الإخراج /root/SelectQueriesToLoad.sql. أخيرًا ، قم بتشغيله:

mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql

سيؤدي هذا بالتأكيد إلى تحميل جميع صفحات الفهرس مسبقًا في InnoDB Buffer Pool و MyISAM Key Cache. إذا كانت جميع بياناتك هي InnoDB ، فقم بإجراء تغييرين:

  • استبدل WHERE engine IN ('InnoDB','MyISAM') بـ WHERE engine='InnoDB'
  • استبدل CONCAT('SELECT ',ndxcollist,' FROM ', بـ CONCAT('SELECT * FROM ',

سيؤدي ذلك أيضًا إلى ملء المزيد من صفحات البيانات في InnoDB Buffer Pool.

ملاحظة نهائية: تأكد من أن InnoDB Buffer Pool كبير بما يكفي لاستيعاب جميع بيانات InnoDB

10
RolandoMySQLDBA

أنت تقوم بالفعل بالتخزين المؤقت لقاعدة البيانات بأكملها في الذاكرة. من المؤكد أن المشكلة هي الوقت المستغرق للبحث في قاعدة البيانات ، حتى في ذاكرة الوصول العشوائي.

مشاهدة إحصائيات الإدخال/الإخراج للقرص. ربما سترى أن هناك فقط جزءًا عشوائيًا عشوائيًا من القرص I/O. قاعدة البيانات هي في الذاكرة. هذه ليست المشكلة. يلزمك تثبيت iostat أولاً. لا تذكر منصتك أو توزيعك ، ولكن من المحتمل أنها في حزمة تسمى iostat. قد تجد atop أكثر ودية.

هل قام الأشخاص الذين أخبروك بذلك بعد الحصول على أي دليل على أن قاعدة البيانات بأكملها لم تكن موجودة بالفعل في الذاكرة أو أن القرص I/O كان هو المشكلة؟ خلاف ذلك ، فإن نصيحتهم هي ما يعادل الطبيب الذي لم يسبق لك رؤيتك أو فحصك ولكن سمعت للتو أن ذراعك يؤلمك ويطلب منك وضع الجبيرة عليها.

2
David Schwartz