2010-05-27 16 views
8

मुझे किसी तालिका से लगभग 10K पंक्तियां हटाना है जिसमें कुछ मानदंडों के आधार पर 100 मिलियन से अधिक पंक्तियां हैं। जब मैं क्वेरी निष्पादित करता हूं, इसमें लगभग 5 मिनट लगते हैं। मैंने एक व्याख्या योजना (delete क्वेरी select * में परिवर्तित की है क्योंकि MySQL explain delete का समर्थन नहीं करता है) और पाया कि MySQL गलत अनुक्रमणिका का उपयोग करता है।MySQL, हटाएं और अनुक्रमणिका संकेत

मेरा प्रश्न है: क्या MySQL को बताने के दौरान उपयोग करने के लिए कोई अनुक्रमणिका है? यदि नहीं, तो मैं क्या करूँ? अस्थायी तालिका का चयन करें, फिर temp तालिका से हटा दें?

+0

सुनिश्चित करें कि आपके पास प्राथमिक कुंजी है और आपके डिलीट के WHERE खंड में नामित कॉलम अनुक्रमित है। –

उत्तर

4

index hint syntax है। //ETA: sadly, not for deletes

ईटीए: क्या आपने ANALYZE TABLE $mytable चलाने का प्रयास किया है?

यदि यह भुगतान नहीं करता है, तो मुझे लगता है कि आपके पास 2 विकल्प हैं: हटाए जाने से पहले अपमानजनक सूचकांक को छोड़ दें और इसे फिर से बनाएं। या वांछित अनुक्रमणिका पर अपनी हटाई गई तालिका को दूसरी तालिका में शामिल करें जो सुनिश्चित करना चाहिए कि वांछित अनुक्रमणिका का उपयोग किया जाए।

+1

हां, लेकिन मेरी समझ सूचकांक संकेत हटाने के लिए काम नहीं करता है। –

+0

@ मैनुअल डार्वेउ: ड्रैट! बस इसका परीक्षण किया। तुम सही हो। – dnagirl

2

मैंने कभी ऐसी परिस्थिति में कभी नहीं देखा है जहां MySQL ने गलत इंडेक्स चुना है, बल्कि मेरी समझ है कि इंडेक्स कैसे काम करते थे, आमतौर पर गलती थी।

आप इस पुस्तक की जाँच करने के लिए चाहते हो सकता है: http://oreilly.com/catalog/9780596003067

यह और कैसे अनुक्रमित काम पर एक बड़ा खंड अन्य ट्यूनिंग विकल्प है।

+0

+1, पुस्तक आपकी आँखें कई चीजों पर खुलती है जो आप कभी नहीं सोचेंगे। – newtover

+0

संपादन, dnagirl इंडेक्स संकेत वाक्यविन्यास के बारे में सही है, मुझे नहीं पता था कि लाइव चला गया। – UltimateBrent

+0

मैंने देखा है कि mysql कई बार गलत इंडेक्स चुनते हैं। हमारे लिए यह एक बड़ी मेज (15 एम पंक्तियों) पर होता है जिसमें बहुत सी समान अनुक्रमणिका (15 इंडेक्स) होती हैं। शायद एक पागल परिदृश्य --- एक कारण है --- और यह गलत सूचकांक अक्सर मिलता है, भले ही इंडी चुनने के लिए प्राथमिक होना चाहिए। –

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