ما هي أسهل طريقة لإضافة فهرس على جدول myISAM المباشر؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

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

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

تحديث:القراءة عن "عمليات الفهرس عبر الإنترنت" في SQL Server تجعلني أشعر بغيرة شديدة http://msdn.microsoft.com/en-us/library/ms191261.aspx :)

شكرًا!

هل كانت مفيدة؟

المحلول

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

لإعداد العبد، انظر http://dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html

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

بمجرد أن يكون لديك العبد قيد التشغيل ويكون لديك التحقق من أن كل شيء يتكرر بشكل صحيح, ، أنت تستطيع وقفة العبد.إنشاء الفهرس على المرهم.عند اكتمال إنشاء الفهرس، قم باستئناف العبد.وهذا سوف يلحق بالعبد إلى سيده.على اللوحة الرئيسية، استخدم FLUSH TABLE مع قفل القراءة.تحقق من حالة العبد للتأكد من تطابق موضع السجل على السيد والعبد.إذا فعلوا ذلك، قم بإيقاف تشغيل العبد وانسخ ملفات هذا الجدول مرة أخرى إلى الجدول الرئيسي.

نصائح أخرى

أنا مع راندي.لقد كنا في موقف مماثل، وهناك طريقتان في MySQL لإنجاز شيء مثل هذا:

  1. إنزال الخادم أثناء تشغيله.هذا ما ستفعله على الأرجح.إنه بسيط وسهل ويعمل.الوقت للقيام؟ربما نصف ساعة/45 دقيقة، اعتمادًا على النطاق الترددي للقرص.انظر أدناه.

  2. أنشئ جدولًا جديدًا باستخدام الفهرس الجديد، وانسخ جميع البيانات، وأوقف الخادم مؤقتًا، واحذف الجدول الأول، وقم بتغيير الاسم الجديد إلى الاسم القديم، ثم ابدأ تشغيل الخادم.التوقف؟ربما 10 دقائق، لكنها معقدة حقًا.

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

هل لديك خادم ثانٍ قريب في المواصفات من خادم الإنتاج الخاص بك؟قم بتحميل أحدث نسخة احتياطية لديك وقم بالفهرسة هناك، حتى تعرف المدة التي ستستغرقها عملية الإضافة.ثم خطط لوقت التوقف عن العمل.

يعد InnoDB أفضل في العديد من الأشياء، لكن الفهارس الجديدة لا تزال تقفل الجدول.تلك القدرات التي يمتلكها MSSQL (وأعتقد PostgreSQL) للقيام بهذا النوع من الأشياء دون قفل ستكون رائعة.

والبحث نافذة الاستخدام المنخفض واتخاذ الخاص بك تطبيق حاليا أثناء الإنشاء مؤشر. منذ لم يكن لديك تكرار أو multimaster أو أيا كان، كنت فقط ستكون لدينا لدغة الرصاص على هذه الخطوة. نراكم في 01:00. : -)

وليس هناك الكثير يمكنك القيام به مع ملقم واحد هنا.

إذا قمت بنسخ الجدول والقيام تجف، على الأقل عليك معرفة كم من الوقت سيستغرق بدون تأمين الجدول الحية، لذلك يمكنك جدولة بعض الوقت الصيانة إذا لزم الأمر، أو اتخاذ قرار ما إذا كنت تستطيع مجرد الضغط على زر وترك المستخدمين شنقا لبضع دقائق:)

وأو جدولة لفترة هادئة ...

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top