2010-12-01 16 views
5

प्रक्रिया के अंदर ताले के आवेषण का चयन करता है हमारे पास एक बड़ी माईसाम तालिका है जिसमें पंक्तियों के नीचे पंक्तियां डाली जाती हैं।MyISAM केवल

कुछ बेंचमार्क करते समय, मुझे एहसास हुआ कि चयन (हमेशा) उसी तालिका में अन्य आवेषण को लॉक नहीं करता है। हालांकि, जब एक संग्रहित प्रक्रिया/समारोह से आवेषण आ रहे हैं तो वे चयन द्वारा बंद कर देंगे।

वह क्यों है?

CREATE TABLE Foo (
    ID INT NOT NULL AUTO_INCREMENT, 
    Bar VARCHAR(200), 
    PRIMARY KEY(ID)) ENGINE=MyISAM; 

--INSERT into Foo 10M rows 


DELIMITER $$ 

DROP PROCEDURE IF EXISTS InsertProc$$ 

CREATE PROCEDURE InsertProc(IN vBar VARCHAR(255)) 
BEGIN 
    INSERT Foo(Bar) VALUES (vBar); 
END$$ 

DELIMITER ; 

भागो निम्न क्वेरी:

SELECT Count(*) FROM Foo WHERE INSTR(Bar, 'abcdefg') > 0; 

है कि चयन चल रहा है, एक नया कनेक्शन निम्नलिखित डालने क्वेरी को खोलने और चलाने:

INSERT Foo(Bar) VALUES ('xyz1234'); 

इस व्यवहार प्रदर्शित करने के लिए

वह सम्मिलन चलाएगा और तुरंत वापस आ जाएगा, हालांकि अगर मैं निम्नलिखित क्वेरी चलाता हूं:

CALL InsertProc('xyz1234'); 

अब पूछताछ ताले और पूरा करने के लिए चयन के लिए इंतजार कर रहा है।

MySql संस्करण: विंडो सर्वर 2K3

पर 5.0.51 चल धन्यवाद।

सम्मिलित प्रत्यक्ष:: प्रक्रिया के माध्यम से

(initialization)  0.0000432 
checking permissions 0.0000074 
Opening tables  0.0000077 
System lock   0.0000032 
Table lock   0.0000025 
init     0.000021 
update    0.0002365 
end     0.0000382 
query end   0.000002 
freeing items  0.0000057 
closing tables  0.0000022 
logging slow query 0.0000005 

सम्मिलित: -

अद्यतन यहाँ प्रोफ़ाइल उत्पादन होता है

(initialization) 0.0000285 
Opening tables 0.0004325 
System lock  0.0000022 
Table lock  0.0002957 
checking permissions 0.0000047 
Opening tables 0.000004 
System lock  0.0000017 
Table lock  3.2365122 
init    0.0000422 
update   0.000251 
end    0.0000025 
query end  0.000003 
closing tables 0.00004 
query end  0.0000074 
freeing items 0.0000074 
logging slow query 0.000001 
cleaning up  0.5790915 

क्यों प्रक्रिया खुली और "तालिका लॉक" दो बार ?

+0

मैं यहाँ के आसपास नया हूँ, मैं कैसे इस सवाल का एक इनाम जोड़ सकता हूँ? –

+0

यदि आप किसी विशेष समस्या का कारण बन रहे हैं तो क्या आप और अधिक समझा सकते हैं? – zanlok

+0

@zanlok, समस्या यह है कि हमें डीबी में संग्रहीत प्रक्रियाओं से आवेदन में अपने कोड को स्थानांतरित करने की आवश्यकता होगी। जब तक इस लॉकिंग मुद्दे के आसपास कोई रास्ता नहीं है –

उत्तर

1

किसी भी विशेष कारण के लिए MyIASM? InnoDB तालिकाओं में आमतौर पर बहुत अच्छी लॉकिंग विशेषताएं होती हैं।

+0

हां, यह एक भारी सूची लिखें। हम MyISAM –

0

अटकलें: शायद संग्रहीत प्रक्रियाओं का उपयोग होने पर MyISAM तालिकाओं पर AUTO_INCREMENT फ़ील्ड पर लॉकिंग/म्यूटेक्स हैंडलिंग कठोर है।

इसे रद्द करने के लिए, क्या आप एक परीक्षण स्थापित कर सकते हैं जहां IDAUTO_INCREMENT फ़ील्ड नहीं था?

क्या आपने INSERT DELAYED दिया है यदि आप इसे एप्लिकेशन की अनुमति दे सकते हैं?

+0

के साथ बेहतर प्रदर्शन प्राप्त करते हैं AUTO_INCREMENT को हटाने में मदद नहीं करता है। 'इंसर्ट डेलेड' हमारे लिए काम नहीं करता है। –

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