2013-06-05 7 views
5

मैं कारण LONGTEXT क्षेत्र के लिए एक मुद्दा हो रहा है में लटका। सबकुछ ठीक काम करता है, लेकिन जब किसी चयन क्वेरी को किसी भी WHERE क्लॉज के साथ निष्पादित किया जाता है, तो MySQL सो जाता है और कभी वापस नहीं आता है। केवल 80k रिकॉर्ड और स्पष्ट हैं जहां तुलना ठीक काम करती है। (कुछ रिकॉर्ड 1 एम से अधिक हैं, कुछ लगभग 700 के हैं, लेकिन बाकी केवल 60 से 100 केबी की तरह हैं)।MySQL - LongText क्षेत्र कारणों का चयन करें-WHERE कथन

उदाहरण के लिए:

[HANGs] 
SELECT * FROM item_info 
WHERE added_on > '2013-02-14 19:40:05' AND added_on < '2013-02-15 19:40:05'  
;which is like 2 rows only 

[FINE] 
SELECT * from item_info 
WHERE item_id in (1, 10, 1000) 

यह सामान्य व्यवहार है?

CREATE TABLE `item_info` (
    `item_id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `title_md5` varchar(35) NOT NULL, 
    `original_document` longtext NOT NULL, 
    `added_on` datetime NOT NULL, 
    PRIMARY KEY (`item_id`), 
    UNIQUE KEY `md5_Unique` (`title_md5`) 
) ENGINE=MyISAM AUTO_INCREMENT=87781 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC; 

कोई समाधान है:

यहाँ स्कीमा है? या क्या मुझे लांगटेक्स्ट फ़ील्ड को एक विदेशी तालिका के साथ एक नई तालिका में अलग करना है?

+0

'लांगटेक्स्ट' तिथि तुलना के साथ इसका कोई संबंध नहीं है महंगा तुलना महंगा हो सकती है। –

+0

@ डैनियलए। वास्तव में लेकिन इस मामले में केवल 88k रिकॉर्ड – Stephan

+0

लॉकिंग समस्या की तरह लगता है। आप क्वेरी कहां निष्पादित कर रहे हैं? किसी भाषा से या SQL कमांड लाइन से? मुझे संदेह है कि इसमें LONGTEXT या दिनांक तुलना के साथ कुछ भी करना है। –

उत्तर

0

सरल लगता है, लेकिन यदि संभव हो तो MySQL के संस्करण का नवीनीकरण, स्मृति सीमा और अधिकतम निष्पादन समय भी बढ़ा कर देखें।

5

आप MyISAM तालिकाओं का उपयोग कर रहे हैं। उन पर एक प्रतिबंध है जो InnoDB पर मौजूद नहीं है;

MyISAM हमेशा डिस्क से पूरा पंक्ति पढ़ता है, भले ही कुछ क्षेत्रों का चयन में क्वेरी नहीं कर रहे हैं।

स्कीमा लगता है कि आपके पास item_id पर एक सूचकांक है लेकिन added_on पर नहीं है।

जब से तुम added_on पर कोई सूचकांक है, क्वेरी एक पूर्ण तालिका स्कैन उत्पन्न होगा। लंबी पंक्तियों वाले MyISAM तालिका पर एक पूर्ण तालिका स्कैन डिस्क से डेटा के लॉट को पढ़ने की आवश्यकता होगी।

added_on पर एक इंडेक्स जोड़ना आपकी क्वेरी को थोड़ा सा गति देगा, क्योंकि आपको केवल तालिका पंक्तियों को वास्तव में पढ़ना होगा।

+0

यह सिर्फ add_on नहीं है, अन्य सरल फ़ील्ड हैं और आउटपुट एक ही धीमी है ... –

+0

क्या आप सुझाव दे रहे हैं कि मुझे इसे 'इनो डीबी' में बदलना चाहिए? –

+0

मैंने सोचा कि 'इनो डीबी' 'एसिड लेनदेन 'के विशेषज्ञ थे; लेकिन केवल एक ही तरीके से पढ़ने के लिए, 'माईसाम' सबसे अच्छा था ... –

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