هل هناك أي عيوب/أشياء تحتاج إلى معرفتها عند التغيير من MyISAM إلى InnoDB

StackOverflow https://stackoverflow.com/questions/225150

سؤال

يستخدم أحد مشاريعي محرك MyISAM في MySQL، لكنني أفكر في تغييره إلى InnoDB لأنني أحتاج إلى دعم المعاملات هنا وهناك.

  • ما الذي يجب أن أنظر إليه أو أفكر فيه قبل القيام بذلك؟
  • هل يمكنني فقط تغيير المحرك أم يجب إعداد البيانات لذلك؟
هل كانت مفيدة؟

المحلول

نعم بالتأكيد، هناك أشياء كثيرة، يجب عليك اختبار طلبك بدقة شديدة:

  • يمكن أن تصل المعاملات إلى طريق مسدود وتحتاج إلى التكرار.هذا هو الحال (في بعض الظروف) حتى مع المعاملة التي يتم الالتزام بها تلقائيًا والتي تُدرج صفًا واحدًا فقط.
  • من المؤكد تقريبًا أن استخدام القرص سيزداد
  • من المؤكد تقريبًا أن تحميل الإدخال/الإخراج أثناء الكتابة سيزداد
  • سيتغير سلوك الفهرسة لأن InnoDB يستخدم فهارس مجمعة - قد يكون هذا تأثيرًا مفيدًا في بعض الحالات
  • سوف تتأثر استراتيجية النسخ الاحتياطي الخاصة بك.النظر في هذا بعناية.

ستحتاج عملية الترحيل نفسها إلى التخطيط بعناية، لأنها ستستغرق وقتًا طويلاً إذا كان لديك الكثير من البيانات (خلال هذه الفترة ستكون البيانات إما للقراءة فقط أو غير متاحة تمامًا - تحقق!)

نصائح أخرى

هناك تحذير واحد كبير.إذا واجهت أي نوع من فشل الأجهزة (أو ما شابه ذلك) أثناء الكتابة، فسيؤدي InnoDB إلى إتلاف الجداول.

سيقوم MyISAM بذلك أيضًا، لكن mysqlcheck --auto-repair سوف يقوم بإصلاحها.ستفشل محاولة ذلك مع جداول InnoDB.نعم هذا عن تجربه

هذا يعني أنك بحاجة إلى خطة جيدة للنسخ الاحتياطي للبيانات بشكل منتظم لاستخدام InnoDB.

بعض الملاحظات الأخرى:

لا يقوم InnoDB بإعادة تخصيص المساحة الحرة على نظام الملفات بعد إسقاط جدول/قاعدة بيانات أو حذف سجل، ويمكن حل ذلك عن طريق "التفريغ والاستيراد" أو الإعداد innodb_file_per_table=1 في my.cnf.

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

يعد InnoDB أيضًا أكثر كثافة في الذاكرة، وأقترح عليك أن تكون أكبر حجمًا innodb_buffer_pool_size المتغير الذي تسمح به ذاكرة الخادم لديك (70-80% يجب أن يكون رهانًا آمنًا).إذا كان الخادم الخاص بك هو UNIX/Linux، ففكر في تقليل متغير sysctl vm.swappiness إلى 0 واستخدامها innodb_flush_method=O_DIRECT لتجنب التخزين المؤقت المزدوج.اختبر دائمًا ما إذا قمت بالضغط على المبادلة عند تبديل هذه القيم. يمكنك دائمًا قراءة المزيد على مدونة بيركونا, ، وهو أمر عظيم.

أيضا، يمكنك تشغيل mysqlbackup مع --single-transaction --skip-lock-tables وليس لديهم أقفال للجدول أثناء بدء النسخ الاحتياطي.

على أية حال، InnoDB رائع، لا تدع بعض المخاطر تثبط عزيمتك.

مجرد تغيير الطاولة وضبط المحرك يجب أن يكون جيدًا.

  • واحدة من الأشياء الكبيرة التي يجب الانتباه إليها هي ذلك select count(*) from MyTable يكون كثيراً أبطأ في InnoDB من MyISAM.
  • ستتم إعادة تعيين قيم الزيادة التلقائية إلى أعلى قيمة في الجدول +1 بعد إعادة تشغيل الخادم - وهذا يمكن أن يسبب مشاكل مضحكة إذا كان لديك قاعدة بيانات فوضوية مع بعض عمليات الحذف.
  • ستكون إعدادات الخادم المثالية مختلفة عن MyISAM db بشكل أساسي.
  • تأكد من أن حجم ملف innodb كبير بما يكفي لاستيعاب جميع بياناتك وإلا ستتعرض للصلب من خلال إعادة التخصيص المستمر عند تغيير محركات الجداول.

إذا كنت تنوي استخدام InnoDB كوسيلة للحصول على استعلامات متزامنة، فستحتاج إلى تعيينها innodb_file_trx_commit=1 حتى تحصل على بعض الأداء مرة أخرى.OTOH، إذا كنت تتطلع إلى إعادة ترميز تطبيقك ليكون على علم بالمعاملات، فإن تحديد هذا الإعداد سيكون جزءًا من مراجعة الأداء العامة اللازمة لإعدادات InnoDB.

الشيء الرئيسي الآخر الذي يجب الانتباه إليه هو أن InnoDB لا يدعم مؤشرات النص الكامل، ولا يتم تأخير الإدخال.ولكن بعد ذلك، لا يدعم MyISAM التكامل المرجعي.:-)

ومع ذلك، يمكنك فقط نقل الجداول التي تحتاج إلى معرفة المعاملات.لقد فعلت هذا.غالبًا ما يمكن تغيير الجداول الصغيرة (التي تصل إلى عدة آلاف من الصفوف) بشكل سريع، بالمصادفة.

يمكن أن تكون خصائص الأداء مختلفة، لذلك قد تحتاج إلى مراقبة الحمل.

البيانات سوف تكون على ما يرام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top