it-swarm.asia

ما هي الاختلافات الرئيسية بين InnoDB و MyISAM؟

ما هي الاختلافات الرئيسية بين InnoDB و MyISAM؟

255
ilhan

أول فرق رئيسي أراه هو أن InnoDB يطبق قفلًا على مستوى الصف بينما يمكن لـ MyISAM القيام فقط بقفل على مستوى الجدول. ستجد استرداد أفضل للتعطل في InnoDB. ومع ذلك ، فإنه لا يحتوي على FULLTEXT فهارس البحث حتى الإصدار 5.6 ، مثل MyISAM. يقوم InnoDB أيضًا بتنفيذ المعاملات والمفاتيح الخارجية وقيود العلاقات بينما لا يقوم MyISAM بذلك.

يمكن أن تذهب القائمة أبعد من ذلك بقليل. ومع ذلك ، فإن لكل منهما مزاياه الفريدة لصالحه وعيوبه ضد بعضها البعض. كل واحد منهم أكثر ملاءمة في بعض السيناريوهات من الآخر.

لذا لتلخيص (TL؛ DR):

  • يحتوي InnoDB على قفل على مستوى الصف ، يمكن لـ MyISAM فقط القيام بالقفل الكامل على مستوى الجدول.
  • إن InnoDB لديه أفضل التعافي من التعطل.
  • يحتوي MyISAM على FULLTEXT فهارس البحث ، لم يكن InnoDB حتى MySQL 5.6 (فبراير 2013).
  • يقوم InnoDB بتنفيذ المعاملات والمفاتيح الخارجية وقيود العلاقات ، ولا يقوم MyISAM بذلك.
165
poelinca

اختلاف رئيسي آخر لم يتم ذكره بعد هو كيفية إجراء التخزين المؤقت لكل محرك تخزين.

[~ # ~] myisam [~ # ~]

الآلية الرئيسية المستخدمة هي ذاكرة التخزين المؤقت الرئيسية. يقوم فقط بتخزين صفحات الفهرس من ملفات .MYI. لتغيير حجم ذاكرة التخزين المؤقت الرئيسية ، قم بتشغيل الاستعلام التالي:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;

سيعطي هذا الإعداد الموصى به لـ MyISAM Key Cache ( ( key_buffer_size ) بالنظر إلى مجموعة البيانات الحالية ( الاستعلام ستحدد التوصية على 4G (4096M). بالنسبة لنظام التشغيل 32 بت ، 4 غيغابايت هي الحد الأقصى. بالنسبة إلى 64 بت ، 8 جيجابايت.

InnoDB

الآلية الرئيسية المستخدمة هي InnoDB Buffer Pool. يقوم بتخزين البيانات وفهرس الصفحات من جداول InnoDB التي يتم الوصول إليها. لتحديد حجم InnoDB Buffer Pool ، قم بتشغيل الاستعلام التالي:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;

سيعطي هذا الإعداد الموصى به لحجم تجمع InnoDB المؤقت ( innodb_buffer_pool_size ) نظرًا لمجموعة البيانات الحالية.

لا تنس تغيير حجم ملفات سجل InnoDB (ib_logfile0 و ib_logfile1). يضع رمز مصدر MySQL حدًا لأحجام جميع ملفات سجل InnoDB يجب أن يكون <4G (4096M). من أجل البساطة ، بالنظر إلى ملفي سجل فقط ، إليك كيفية تحديد حجمها:

  • الخطوة 1) أضف innodb_log_file_size = NNN إلى /etc/my.cnf (يجب أن يكون NNN 25٪ من innodb_buffer_pool_size أو 2047 مليونًا ، أيهما أصغر)
  • الخطوة 2) service mysql stop
  • الخطوه 3) rm /var/log/mysql/ib_logfile[01]
  • الخطوة 4) service mysql start (تمت إعادة إنشاء ib_logfile0 و ib_logfile1)

[~ # ~] تحذير [~ # ~]

في نهاية كلا الاستفسارين يوجد استعلام مضمن (SELECT 2 PowerOf1024) ب

  • (SELECT 0 PowerOf1024) يعطي الإعداد بالبايت
  • (SELECT 1 PowerOf1024) يعطي الإعداد بالكيلوبايت
  • (SELECT 2 PowerOf1024) يعطي الإعداد بالميجابايت
  • (SELECT 3 PowerOf1024) يعطي الإعداد بالجيجابايت
  • لا توجد سلطات أقل من 0 أو أكبر من 3 مقبولة

[~ # ~] خاتمة [~ # ~]

لا يوجد بديل عن الفطرة السليمة. إذا كانت لديك ذاكرة محدودة ، أو مزيج من محركات التخزين ، أو مزيج منها ، فسيتعين عليك التكيف مع سيناريوهات مختلفة.

  • إذا كان لديك 2 غيغابايت RAM و 16 غيغابايت من InnoDB ، فقم بتخصيص 512M كـ innodb_buffer_pool.
  • إذا كان لديك 2 غيغابايت RAM و 4 غيغابايت من فهارس MyISAM ، فقم بتخصيص 512M كـ key_buffer_size.
  • إذا كان لديك 2 غيغابايت RAM و 4 غيغابايت من فهارس MyISAM و 16 غيغابايت InnoDB ، فقم بتخصيص 512M كـ key_buffer_size و 512M كـ innodb_buffer_pool_size.

السيناريوهات المحتملة لا حصر لها !!!

تذكر ، مهما تخصصت ، اترك ما يكفي RAM لاتصالات DB ونظام التشغيل.

89
RolandoMySQLDBA

يقدم InnoDB:

  • معاملات ACID
  • قفل على مستوى الصف
  • قيود المفتاح الأجنبي
  • الانتعاش التلقائي تحطم
  • ضغط الجدول (قراءة/كتابة)
  • أنواع البيانات المكانية (لا توجد فهارس مكانية)

في InnoDB يمكن لجميع البيانات المتتالية باستثناء TEXT و BLOB أن تشغل 8000 بايت على الأكثر. فهرسة النص الكامل غير متاحة في InnoDB حتى MySQL 5.6 (فبراير 2013). في InnoDB ، يتم تنفيذ COUNT(*) s (عندما لا يتم استخدام WHERE أو GROUP BY أو JOIN) بشكل أبطأ من MyISAM لأنه لا يتم تخزين عدد الصفوف داخليًا . يخزن InnoDB كلاً من البيانات والفهارس في ملف واحد. يستخدم InnoDB تجمع مخزن مؤقت لتخزين البيانات والفهارس.

تقدم MyISAM:

  • fast COUNT(*) s (عند عدم استخدام WHERE أو GROUP BY أو JOIN)
  • فهرسة النص الكامل (تحديث: مدعوم في InnoDB من MySQL 5.6)
  • بصمة قرص أصغر
  • ضغط جدول مرتفع جدًا (للقراءة فقط)
  • أنواع وفهارس البيانات المكانية (R-tree) (تحديث: مدعوم في InnoDB من MySQL 5.7)

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

بشكل عام أوصي بـ InnoDB لمعظم الأغراض و MyISAM للاستخدامات المتخصصة فقط. يعد InnoDB الآن المحرك الافتراضي في إصدارات MySQL الجديدة.

63
dabest1

تأخرت قليلاً في اللعبة ... ولكن إليكم صورة شاملة تمامًا منشور كتبته قبل بضعة أشهر ، مع توضيح الاختلافات الرئيسية بين MYISAM و InnoDB. تناول كوبًا (وربما بسكويت) واستمتع.


الفرق الرئيسي بين MyISAM و InnoDB هو في التكامل والمعاملات المرجعية. هناك أيضًا اختلافات أخرى مثل القفل ، والعودة ، وعمليات البحث عن النص الكامل.

التكامل المرجعي

يضمن التكامل المرجعي استمرار العلاقات بين الجداول. بشكل أكثر تحديدًا ، هذا يعني أنه عندما يحتوي الجدول (مثل القوائم) على مفتاح خارجي (مثل معرف المنتج) يشير إلى جدول مختلف (مثل المنتجات) ، عندما تحدث تحديثات أو حذف إلى الجدول المشار إليه ، فإن هذه التغييرات تتالي إلى الارتباط الطاولة. في مثالنا ، إذا تمت إعادة تسمية المنتج ، فسيتم أيضًا تحديث المفاتيح الخارجية لجدول الربط ؛ إذا تم حذف منتج من جدول "المنتجات" ، فسيتم أيضًا حذف أي قوائم تشير إلى الإدخال المحذوف. علاوة على ذلك ، يجب أن تحتوي أي قائمة جديدة على هذا المفتاح الخارجي مشيراً إلى إدخال صالح موجود.

إن InnoDB هو نظام DBMS علائقي (RDBMS) وبالتالي لديه تكامل مرجعي ، في حين أن MyISAM ليس كذلك.

المعاملات و الذرية

تتم إدارة البيانات في جدول باستخدام عبارات لغة معالجة البيانات (DML) ، مثل SELECT و INSERT و UPDATE و DELETE. مجموعة معاملة اثنين أو أكثر من عبارات DML معًا في وحدة عمل واحدة ، لذلك إما أن يتم تطبيق الوحدة بأكملها ، أو لا يتم تطبيق أي منها.

لا يدعم MyISAM المعاملات بينما يدعمها InnoDB.

إذا تمت مقاطعة عملية أثناء استخدام جدول MyISAM ، فسيتم إحباط العملية على الفور ، وستظل الصفوف (أو حتى البيانات الموجودة في كل صف) المتأثرة متأثرة ، حتى إذا لم تنته العملية.

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

قفل الطاولة مقابل تأمين الصف

عند تشغيل استعلام مقابل جدول MyISAM ، سيتم تأمين الجدول بأكمله الذي يتم الاستعلام عنه. هذا يعني أنه سيتم تنفيذ الاستعلامات اللاحقة فقط بعد انتهاء الاستفسار الحالي. إذا كنت تقرأ جدولًا كبيرًا ، و/أو كانت هناك عمليات قراءة وكتابة متكررة ، فقد يعني ذلك تراكمًا كبيرًا في الاستعلامات.

عندما يتم تشغيل الاستعلام مقابل جدول InnoDB ، يتم قفل الصف (الصفوف) المتضمن فقط ، ويظل باقي الجدول متاحًا لعمليات CRUD. وهذا يعني أنه يمكن تشغيل الاستعلامات في نفس الوقت على نفس الجدول ، بشرط ألا يستخدموا نفس الصف.

تُعرف هذه الميزة في InnoDB بالتزامن. بقدر ما هو التزامن ، هناك عيب كبير ينطبق على مجموعة مختارة من الجداول ، حيث يوجد حمل في التبديل بين خيوط النواة ، ويجب عليك وضع حد على خيوط النواة لمنع الخادم من التوقف .

المعاملات والتراجع

عند تشغيل عملية في MyISAM ، يتم تعيين التغييرات ؛ في InnoDB ، يمكن التراجع عن هذه التغييرات. أكثر الأوامر المستخدمة للتحكم في المعاملات هي COMMIT و ROLLBACK و SAVEPOINT. 1. COMMIT - يمكنك كتابة عمليات DML متعددة ، ولكن لن يتم حفظ التغييرات إلا عند إجراء COMMIT 2. ROLLBACK - يمكنك تجاهل أي عمليات لم يتم الالتزام بها بعد. 3. SAVEPOINT - تحدد نقطة في قائمة العمليات التي يمكن أن ترجع إليها عملية ROLLBACK

الموثوقية

لا يقدم MyISAM أي تكامل للبيانات - يمكن أن تتسبب أعطال الأجهزة وعمليات الإغلاق غير النظيفة والعمليات الملغاة في تلف البيانات. وهذا يتطلب إصلاحًا كاملاً أو إعادة بناء الفهارس والجداول.

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

فهرسة FULLTEXT

لا يدعم InnoDB فهرسة FULLTEXT حتى إصدار MySQL 5.6.4. حتى كتابة هذا المنشور ، لا يزال العديد من إصدار MySQL لموفري الاستضافة المشتركة أقل من 5.6.4 ، مما يعني أن فهرسة FULLTEXT غير مدعومة لجداول InnoDB.

ومع ذلك ، هذا ليس سببًا صالحًا لاستخدام MyISAM. من الأفضل التغيير إلى مزود استضافة يدعم أحدث إصدارات MySQL. لا يمكن تحويل جدول MyISAM الذي يستخدم فهرسة FULLTEXT إلى جدول InnoDB.

استنتاج

في الختام ، يجب أن يكون InnoDB محرك التخزين الافتراضي الذي تختاره. اختر MyISAM أو أنواع البيانات الأخرى عندما تخدم حاجة معينة.

32
d4nyll

شيء آخر: يمكنك نسخ جداول InnoDB احتياطيًا بمجرد أخذ لقطة من نظام الملفات. يتطلب نسخ MyISAM احتياطيًا استخدام mysqldump وليس من المضمون أن يكون متسقًا (على سبيل المثال ، إذا أدخلت في جدول أصل وجدول فرعي ، فقد تجد صف الجدول الفرعي فقط في النسخة الاحتياطية).

بشكل أساسي ، إذا كان لديك نسخة أخرى من البيانات وتخزنها مؤقتًا فقط في MySQL ، على سبيل المثال للسماح بوسيلة قياسية للوصول إليه من موقع ويب [PHP ، فإن MyISAM على ما يرام (أي أنه أفضل من ملف CSV مسطح أو ملف تسجيل للاستعلام والوصول المتزامن). إذا كانت قاعدة البيانات هي "النسخة الرئيسية" الفعلية للبيانات ، إذا كنت تستخدم INSERT و UPDATE باستخدام بيانات حقيقية من المستخدمين ، فمن الحماقة استخدام أي شيء آخر غير InnoDB ، في أي نوع من حجم MyISAM غير موثوق به ويصعب إدارته ، ستؤدي myisamchk نصف الوقت ، وتنفي أي مكاسب في الأداء ...

(تجربتي الشخصية: 2 تيرابايت DB في MyISAM).

31
Gaius

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

تشمل الاختلافات المهمة الأخرى ما يلي:

  1. تدعم InnoDB المعاملات والمفاتيح الخارجية. لا MyISAM.
  2. يستخدم MyISAM فهرسة النص الكامل.
  3. يقوم MyISAM بعمل ضعيف في فرض تكامل البيانات.
19
bsoist

أميل إلى النظر إلى MyISAM باعتباره خيار الجدول "الافتراضي" لـ MySQL ، لذلك سأشير إلى الاختلافات بالنسبة لمعظم مستخدمي InnoDB

  • تأمين مستوى الصف
  • تطبيق المفتاح الخارجي
  • دعم المعاملات
  • ضرب الأداء على الأنظمة عالية الاستخدام
9
Patrick

يشمل تغييرات MySQL 5.6

محرك التخزين الداخلي:

  • يوفر التوافق الكامل مع ACID (الذرية ، الاتساق ، العزلة ، المتانة). يتم استخدام النسخ المتعددة لعزل المعاملات عن بعضها البعض.
  • يوفر InnoDB إمكانية الاسترداد التلقائي بعد تعطل خادم MySQL أو المضيف الذي يعمل عليه الخادم.
  • يدعم InnoDB المفاتيح الأجنبية والتكامل المرجعي ، بما في ذلك عمليات الحذف والتحديثات المتتالية.
  • يعتمد MySQL 5.6 على منصة InnoDB المدمجة بالكامل كمحرك التخزين الافتراضي
  • إحصائيات المُحسِّن المستمر =: توفر دقة محسنة لإحصاءات فهرس InnoDB ، وتتم إعادة التناسق عبر إعادة تشغيل MySQL.
  • تشذيب ذاكرة التخزين المؤقت لجدول InnoDB: لتخفيف حمل الذاكرة على الأنظمة التي تحتوي على عدد كبير من الجداول ، يحرر InnoDB الآن الذاكرة المرتبطة بجدول مفتوح. تحدد خوارزمية LRU الجداول التي مرت أطول دون الوصول إليها.
  • يدعم البحث عن نص كامل: نوع خاص من الفهرس ، فهرس FULLTEXT ، يساعد InnoDB على التعامل مع الاستعلامات وعمليات DML التي تتضمن أعمدة نصية والكلمات التي تحتوي عليها. يتم تمثيل هذه الفهارس ماديًا كجداول InnoDB كاملة.
  • يبدو أن InnoDB أسرع بكثير في البحث عن نص كامل من MyISAM

لذا ، ليس هناك جدوى من استخدام MyISAM Engine إذا كنت قد تمت ترقيتك بالفعل إلى 5.6 ، وإلا فلن تنتظر الترقية إلى MySQL 5.6.

أداء InnoDB VS MyISAM باستخدام MySQL 5.6

6
Mahesh Patil

MYISAM

يوفر MYISAM قفلًا لمستوى الجدول ، والبحث عن FULLTEXT. تحتوي MYISAM على العمود AUTO_INCREMENTED الأكثر مرونة للتعامل مع جميع محركات التخزين. MYISAM لا يدعم المعاملات.

INNODB

INNODB هو محرك التخزين الآمن للمعاملات. لدى INNODB قدرات الالتزام والاستعادة والاسترداد. يدعم INNODB التكامل المرجعي لمفتاح خارجي.

6
Anto

MyISAM

MyISAM هو محرك تخزين لـ MySQL. قبل MySQL 5.5 كان محرك التخزين الافتراضي لـ MySQL. يعتمد على محرك تخزين ISAM الأقدم. تم تحسين MyISAM للبيئات التي تتميز بعمليات قراءة ثقيلة ، وقليل من عمليات الكتابة ، أو لا شيء على الإطلاق. السبب الذي يسمح به MyISAM للقراءة السريعة هو بنية الفهارس الخاصة به: يشير كل إدخال إلى سجل في ملف البيانات ، ويتم إزاحة المؤشر من بداية الملف. وبهذه الطريقة يمكن قراءة السجلات بسرعة ، خاصة عندما يتم إصلاح التنسيق. وبالتالي ، فإن الصفوف ذات طول ثابت. من المجالات النموذجية التي يمكن للمرء أن يفضل فيها MyISAM هو مستودع البيانات ، لأنه يتضمن استعلامات على جداول كبيرة جدًا ، ويتم تحديث هذه الجداول عندما لا تكون قاعدة البيانات قيد الاستخدام (عادة ليلاً). تعتبر الإدخالات سهلة أيضًا ، لأنه يتم إلحاق الصفوف الجديدة بنهاية ملف البيانات. ومع ذلك ، فإن عمليات الحذف والتحديث أكثر إشكالية: يجب أن تترك الحذف مساحة فارغة ، أو ستتغير تعويضات الصفوف ؛ وينطبق نفس الشيء على التحديثات ، حيث يصبح طول الصفوف أقصر ؛ إذا جعل التحديث الصف أطول ، فسيتم تجزئة الصف. لإلغاء تجزئة الصفوف والمطالبة بمساحة فارغة ، يجب تنفيذ الأمر OPTIMIZE TABLE. بسبب هذه الآلية البسيطة ، عادة ما تكون إحصائيات مؤشر MyISAM دقيقة تمامًا. العيوب الرئيسية الأخرى لـ MyISAM هي غياب دعم المعاملات والمفاتيح الخارجية.

InnoDB

InnoDB هو محرك تخزين لـ MySQL. MySQL 5.5 واستخدامه لاحقًا بشكل افتراضي. يوفر ميزات المعاملات القياسية المتوافقة مع ACID ، إلى جانب دعم المفتاح الخارجي (التكامل المرجعي التعريفي). يطبق كلاً من معاملات SQL و XA ومساحات الجداول وفهارس FULLTEXT والعمليات المكانية التي تتبع معيار OpenGIS. يتم تضمينه كمعيار قياسي في معظم الثنائيات الموزعة بواسطة MySQL AB ، باستثناء بعض إصدارات OEM. البرنامج مرخص من قبل شركة أوراكل ؛ يتم توزيعه بموجب GNU الترخيص العام العام ، ولكن يمكن أيضًا ترخيصه للجهات الراغبة في دمج InnoDB في البرمجيات الاحتكارية.

الشوكات

لدى MariaDB محرك تخزين يسمى Aria ، والذي يوصف بأنه "بديل آمن من تحطم MyISAM". يستخدم MariaDB و Percona Server شوكة من InnoDB تسمى XtraDB بشكل افتراضي. تتم صيانة XtraDB بواسطة Percona. يتم استيراد تغييرات Oracle InnoDB بانتظام إلى XtraDB ، وتتم إضافة بعض إصلاحات الأخطاء والميزات الإضافية.

4
wogsland