हमारे पास एक (वर्तमान में InnoDB) तालिका है जिसमें लगभग 500,000 पंक्तियां हैं। यह चलाने के लिए कार्यों की एक कतार का प्रतिनिधित्व करता है। यह एक MySQL डेटाबेस में संग्रहीत है।MySQL हटाने वाली पंक्तियों पर डेडलॉक्स
एक निरंतर आधार, प्रति सेकंड कम से कम एक बार, लेकिन कभी-कभी अधिक बार, हम इससे डेटा चुनते हैं और बाद में कुछ पंक्तियों को अपडेट करते हैं। प्रति दिन एक बार, हम मेज से पुरानी पंक्तियों को छीनते हैं।
हमने टेबल पर डेडलॉक्स प्राप्त करना शुरू कर दिया और इससे हमारे कार्य प्रसंस्करण को स्थिरता में लाया गया। ये डेडलॉक्स रात के प्रुन रन के दौरान होते थे। हटाएं, चयन, और अद्यतन का संयोजन का मतलब है कि अनिवार्य रूप से कुछ भी उत्पादक नहीं हो सकता है। दुर्भाग्यवश मेरे पास एक शो इंजन इननोड स्थिति का आउटपुट नहीं है।
मैं इससे निपटने के लिए सबसे अच्छा विकल्प जानना चाहता हूं। ध्यान दें कि हमारा कोड डेडलॉक्स का पता लगाता है और क्वेरी को फिर से जारी करता है। साथ ही, हमने बहुत समय पहले पाया था कि सभी मेल खाने वाली पंक्तियों को एक बार डेटाबेस डेटाबेस पर टैक्स करना था, जिसमें बहुत सारी गतिविधियां देखी गईं, इसलिए हम एक समय में हमारे पंक्तियों को 10,000 पंक्तियों तक सीमित करते हैं और क्वेरी को फिर से जारी रखते हैं जब तक कि सभी आवश्यक पंक्तियां नहीं हो जातीं कम कर दिए हैं।
मैं निम्नलिखित विकल्पों के देखते हैं, और राय चाहते हैं, जिस पर सबसे अच्छा, या अन्य विकल्पों के लिए सुझाव दिए गए हैं:
- एक समय
- हमारे हटाता पर घातीय backoff उपयोग पर कम पंक्तियां हटा देगा, हालांकि मैं मुझे चिंता है कि यह MySQL documentation के अनुसार हमारे विशिष्ट वर्कलोड
- लॉक टैबलेट को देने में सहायता नहीं करेगा। हम शायद हटाए गए समय की अवधि के लिए चयन और अद्यतन विवरणों को अवरुद्ध कर सकते हैं।
- MyISAM तालिका प्रकार पर स्विच करें। हम इनो डीबी के साथ गए क्योंकि हम शुरुआत में इस तालिका पर लेनदेन का उपयोग कर रहे थे। यह अब मामला ही नहीं है। मैं यह जानने के लिए विशिष्ट रूप से परिचित नहीं हूं कि यह एक व्यवहार्य समाधान है या नहीं।
- शायद अद्यतन LOW_PRIORITY का उपयोग करें। हो सकता है कि DELETEs SELECTs को प्रभावित न करें, केवल अद्यतन, और यह पर्याप्त हो सकता है।
मेरे सामने आने वाले सभी डेडलॉक्स असामान्य लेनदेन के कारण हैं। सुनिश्चित करें कि आप सही तरीके से चल रहे लेनदेन कर रहे हैं (या तो ऑटोकॉमिट पर या ऑटोोकॉमिट ऑफ और वास्तव में काम/रोलबैक को संभालने)। – localshred
निश्चित रूप से एक अच्छा बिंदु; यह ज्यादातर समय होगा लेकिन हम वास्तव में इस तालिका पर लेनदेन नहीं कर रहे हैं। हम करते थे, लेकिन अब नहीं करते थे। – ChrisInEdmonton