في MySQL ، هل من الأسرع حذف ثم إدخاله أم أنه أسرع لتحديث الصفوف الحالية؟

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

  •  26-09-2019
  •  | 
  •  

سؤال

بادئ ذي بدء ، اسمحوا لي أن أقول أنني أستخدم PHP Framework YII ، لذلك أود أن أبقى ضمن مجموعتها المحددة من بيان SQL إن أمكن. أعلم أنه من المحتمل أن أقوم بإنشاء بيان SQL طويل طويل من شأنه أن يفعل كل شيء ، لكنني أفضل ألا أذهب إلى هناك.

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

يتم تخزين هذه النتائج كصفوف متعددة في جدول FavColors مثل هذا (المعرف ، user_id ، color_id).

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

الخيار 1:

  • قم بحذف جماعي من جميع الصفوف حيث يتطابق user_id
  • ثم قم بإدراج جماعي لجميع الصفوف الجديدة

الخيار 2:

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

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

سيتطلب الخيار 2 الكثير من أعمال البرمجة ، ولكنه سيمنع المواقف التي أحذف فيها صفًا فقط لإنشائه مرة أخرى. ومع ذلك ، فإن إضافة المزيد من الحمل في PHP قد لا يستحق الانخفاض في الحمل لـ MySQL.

أي أفكار؟ ماذا كنت تفعل كل؟

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

المحلول

UPDATE هو أسرع بكثير. عندما انت UPDATE, ، يتم إعادة كتابة سجلات الجدول مع بيانات جديدة. وكل هذا يجب القيام به مرة أخرى INSERT.

عندما انت DELETE, ، يجب تحديث الفهارس (تذكر ، يمكنك حذف الصف بأكمله ، وليس فقط الأعمدة التي تحتاج إلى تعديلها) وقد يتم نقل كتل البيانات (إذا ضربت PCTFREE حد). أيضًا حذف وإضافة معرفات سجلات تغييرات جديدة على Auto_increment ، لذلك إذا كانت هذه السجلات لها علاقات سيتم كسرها ، أو ستحتاج إلى تحديثات أيضًا. سأذهب ل UPDATE.

لهذا السبب يجب أن تفضل INSERT ... ON DUPLICATE KEY UPDATE بدلاً من REPLACE.

السابق هو UPDATE العملية في حالة وجود انتهاك رئيسي ، في حين أن الأخير هو DELETE / INSERT

تحديث: هذا مثال INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

لمزيد من التفاصيل اقرأ التحديث توثيق

نصائح أخرى

فيليب ، هل حاولت القيام بتصريحات معدة؟ مع عبارات معدّة ، يمكنك إعداد استعلام واحد مع معلمات مختلفة والاتصال به عدة مرات. في نهاية الحلقة الخاصة بك ، يمكنك تنفيذها جميعًا بأقل قدر من زمن انتقال الشبكة. لقد استخدمت عبارات معدة مع PHP وتعمل بشكل رائع. أكثر مربكا قليلا من عبارات جافا المعدة.

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