it-swarm.asia

لماذا تظهر سلاسل MySQL غالبًا حالة "تحرير العناصر" عند تعطيل ذاكرة التخزين المؤقت للاستعلام؟

عندما أركض SHOW PROCESSLIST ، غالبًا ما يكون هناك عدد كبير من سلاسل INSERT/UPDATE في حالة "تحرير العناصر".

يقترح دليل MySQL أن جزءًا على الأقل من سبب وجود سلسلة رسائل في هذه الحالة ينطوي على ذاكرة التخزين المؤقت للاستعلام - من المفترض أنه سيبطل الاستعلامات المخزنة مؤقتًا بسبب البيانات المتغيرة.

ومع ذلك ، يا query_cache_size تم تعيينه إلى 0 مما يؤدي إلى تعطيل ذاكرة التخزين المؤقت للاستعلام تمامًا.

ما الأسباب الأخرى التي قد تؤدي إلى وجود العديد من سلاسل الرسائل في هذه الحالة؟

تستخدم الجداول ذات الصلة محرك تخزين InnoDB.

16
Dan Grossman

تحقق من قيمة innodb_thread_concurrency.

بالنسبة لنظامي ، زادت القيمة من 8 إلى 32 ، وفقًا للإرشادات الواردة في وثائق MySql ، مما أدى إلى انخفاض ملحوظ في عدد سلاسل العمليات التي تُبلغ في الوقت نفسه عن حالة "تحرير العناصر". أيضا ، انخفض متوسط ​​وقت الاستعلام المقدر بأمر من الحجم.

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

حظا سعيدا!

أيضا:

من الجدير بالذكر أن القيمة الافتراضية لعملة innodb_thread_concurrency تختلف اختلافًا جذريًا اعتمادًا على إصدار 5.0 نقطة المستخدم.

تم تغيير القيمة الافتراضية عدة مرات: 8 قبل MySQL 5.0.8 ، 20 (لانهائي) من 5.0.8 إلى 5.0.18 ، 0 (لانهائي) من 5.0.19 إلى 5.0.20 ، و 8 (منتهية) من 5.0.21 على. - المصدر

هذا يعني أن ترقية تبدو غير ضارة من 5.0.20 إلى 5.0.21 غيرت الإعداد الافتراضي من لانهائي إلى 8 ، وجلبت معها تداعيات الأداء.

7
jphofmann

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

5
Baron Schwartz

كان هناك تقرير خطأ حول هذه المشكلة بخصوص "تحرير العناصر" وذاكرة التخزين المؤقت للاستعلام . على الرغم من إغلاق الخطأ ، لم يتم ذكر innodb_thread_concurrency .

بالمناسبة ، تحدثت مع رونالد برادفورد في بيركونا لايف نيويورك مرة أخرى في مايو. أخبرته عن موقف قمت فيه بتعديل innodb_thread_concurrency لأن مجموعة التخزين العمودي InnoDB المتعددة في MySQL 5.5 أنتجت أطنانًا من قفل الخيط وكنت أتوقع أن البيانات المخزنة مؤقتًا التي أحتاجها على الأرجح قد انتشرت بين تجمعات المخزن المؤقت المتعددة.

أخبرني بصراحة أنه لا ينبغي لي أبدًا أن أضع قيمًا مقابل عملة البودرة. فليكن دائمًا القيمة الافتراضية ، وهي الآن صفر (0). من خلال القيام بذلك ، فإنك تسمح لوحدة تخزين InnoDB بتحديد عدد innodb_concurrency_tickets التي سيتم إنشاؤها بمفردها. هذا ما يفعله التزامن اللانهائي.

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

3
RolandoMySQLDBA

كانت لدينا مشكلة مع نفس الأعراض بالضبط. اتضح أن القرص مع ملفات سجل InnoDB قد امتلأ. التحقق يستحق.

2
RedBlueThing

تلميح آخر: قد يكون fsync () إينودب. حاول الإعداد

innodb_flush_log_at_trx_commit = 2

في my.cnf

ثم يتم مسح ملف السجل innodb إلى القرص كل 1-2 ثانية ، بدلاً من ob عند كل التزام. عقوبة طفيفة على سلامة البيانات ، وكسب كبير في السرعة.

1
sto