2012-01-02 20 views
12

अटक गया है मुझे अपने वर्तमान डेटाबेस के साथ mysql के साथ कोई समस्या है।रिकॉर्ड अपडेट नहीं कर सकता है,

मेरे पास एक चुनिंदा रिकॉर्ड पर 100 से अधिक कनेक्शन इंतजार कर रहे हैं। जब मैं निष्पादित करता हूं:

show processlist; 

चयन क्वेरी एक बड़ी क्वेरी है और अन्य स्मालर क्वेरी और आवेषण, अद्यतन हैं।

मेरे पास 100 टेबल के साथ एक डेटाबेस है और चयन 5 जोड़ों का उपयोग कर रहा है।

प्रक्रिया को अस्थायी रूप से रोकने का एक तरीका है और अन्य प्रक्रियाओं को पूरा करने के बाद, अन्य प्रक्रियाओं को चलाने दें, तो चयन चलना जारी रख सकता है?

+1

अपनी क्वेरी का विस्तार करें, शायद आपके पास सूचकांक समस्याएं हैं –

+0

उदाहरण के लिए एक INSERT एक चयन पर प्रतीक्षा कैसे कर सकता है? मैं विश्वास नहीं करना चाहता कि किसी भी तरह से कॉन्फ़िगर किया गया आधुनिक SQL सर्वर इस बग को प्रदर्शित कर सकता है ... –

+1

@ पीटर वर्गा: 'माईसाम' में, पढ़ता है लिखता है (और इसके विपरीत)। – Quassnoi

उत्तर

12

मैं क्वेरी यह करने की जरूरत है कि क्या करना यह बताने के लिए, अगर आप किसी भी बंद कर दें या processses या प्रश्नों को मारने आप डेटा अखंडता त्रुटियों जो प्रमुख त्रुटियों को जन्म दे सकता हो सकता है की सिफारिश करेंगे।

BookOfZeus और tfb785 ठीक कह रहे हैं, सब से पहले तो आप शायद अनुक्रमित त्रुटियाँ हैं। जिसे आप बता देंगे वास्तव में समस्या है और क्या देखने के लिए क्या समझाना। उदाहरण के लिए अगर आप 5 मिलती है और आप पंक्ति में गिना जाता है 100,000 और 100 और 1 और 1 और 1, आपने अनेक 100,000 * 100 जो सुपर धीमी हो सकती जाएगा मिलता है।

ध्यान से पढ़ें कि व्याख्या आपको क्या बताती है और इसके आधार पर आपकी क्वेरी को अनुकूलित करती है।

innodb एक अच्छा विकल्प हो सकता है यदि आप टेबल को अक्सर एक्सेस करते हैं क्योंकि इसकी पंक्ति लॉकिंग myisam के लिए टेबल लॉकिंग की स्थापना होती है।

मैं कहूंगा कि पहले अपनी क्वेरी को अनुकूलित करने का प्रयास करें, शायद आपको समस्या को ठीक करने के लिए अपने टेबल इंजन को बदलने की आवश्यकता नहीं है। यदि आपके पास अभी भी समस्याएं हैं तो आप innodb पर जाने पर विचार कर सकते हैं।

+0

मुझे यह जांचने दें कि मेरे पास –

+0

ओह एफ ** के ठीक है मेरे पास है: 1,314,145 1 टेबल पर, दूसरी तालिका में 1,292, तीसरे टेबल पर 11 और शेष 1 हैं। इसलिए इसका मतलब है 1,314,145 * 1292 * 11 * 1 * 1? –

+0

यह आपकी समस्या है, सुनिश्चित करें कि इंडेक्स अच्छे हैं और चाबियाँ हैं (पीके, कुंजी और एफके) सही ढंग से सेटअप कर रहे हैं। –

4

क्या प्रक्रियाओं को अस्थायी रूप से रोकने का कोई तरीका है और अन्य प्रक्रियाओं को पूरा करने के बाद, अन्य प्रक्रियाओं को चलाने दें, तो चयन चलना जारी रख सकता है?

मेरा मानना ​​है कि आप स्टोरेज इंजन के रूप में MyISAM का उपयोग कर रहे हैं।

MyISAM में, पढ़े गए प्रश्न समवर्ती लेखन प्रश्नों को अवरुद्ध करते हैं। यह सुनिश्चित करता है कि लिखने से प्रक्रिया में डेटा नहीं बदलेगा और आपको अपने रिकॉर्डसेट का आधा अपडेट नहीं मिला है और दूसरा आधा अपडेट नहीं किया गया है।

SELECT को आपके द्वारा पूछे जाने वाले तरीके से पूछने का कोई तरीका नहीं है: लिखने से रिकॉर्डसेट असंगत हो सकता है। हालांकि यह आपके सेटअप में वास्तविक मामला नहीं हो सकता है और सैद्धांतिक रूप से लिखने से पढ़ने को प्रभावित नहीं हो सकता है (कहें, अलग-अलग रिकॉर्ड पढ़े और लिखे गए हैं), MyISAM इस बारे में अवगत नहीं है और यह हमेशा मामले में पूरी टेबल को अवरुद्ध करता है।

यदि आपको रीड को ब्लॉक न करने के लिए लिखने की आवश्यकता है, तो InnoDB पर स्विच करें (हालांकि ऐसे मामले हैं जब लिखने से ब्लॉक भी ब्लॉक हो जाएंगे)।

4

आप चल रहे क्वेरी को रोक नहीं सकते हैं और अन्य प्रश्नों को समय दे सकते हैं।

सबसे पहले जिस तरह से: अलगाव स्तर http://dev.mysql.com/doc/refman/5.6/en/mysql-acid.html ये बदले भी मतलब हो सकता है कि आप अपने संग्रहण इंजन जैसे बदलना होगा लेकिन वहाँ अपनी समस्या को हल करने के लिए तीन तरीके हैं। InnoDB करने के लिए।

दूसरा तरीका: अपने लंबे समय तक चलने की कोशिश करें सूचकांक के साथ का चयन करें। यह एक तथाकथित समय मेमोरी व्यापार बंद है। आप सूचकांक पेड़ आयोजित करने के लिए और अधिक स्मृति के साथ आपकी क्वेरी speedup।

तीसरा रास्ता: अपने लंबी चलने वाली Speedup क्वेरी (जुड़ जाता है और चयन) उलटफेर के साथ का चयन करें। सभी क्वेरी भागों की लागत का विश्लेषण करें।

संबंधित मुद्दे