2011-09-04 17 views
13

क्या मुझे लगता है कि UPDATE क्वेरी INSERT क्वेरी से अधिक संसाधन लेती है?अद्यतन बनाम INSERT प्रदर्शन

धन्यवाद,

+4

आप उन लोगों की तुलना क्यों करेंगे? वे पूरी तरह से अलग-अलग उद्देश्यों की सेवा करते हैं, इसलिए आमतौर पर आपके पास कोई विकल्प नहीं होता है - केवल नौकरी करने वाले व्यक्ति का उपयोग करें। –

+0

@ लुकाज़ मिल्वस्की आप एक टेबल को हटाने का विकल्प चुन सकते हैं, और यदि गति तेज हो तो बनाम अपडेट अपडेट करें और आप वास्तव में एक ही परिणाम प्राप्त कर रहे हैं। कभी-कभी इसे हटाने के लिए तेज़ी होती है, फिर सभी पंक्तियों को फिर से लिखना, जिसमें माईएसक्यूएल को पता चलता है कि किसी पंक्ति को – clg4

उत्तर

7

मैं एक डेटाबेस गुरु नहीं कर रहा हूँ, लेकिन यहाँ मेरे दो सेंट:

निजी तौर पर मुझे नहीं लगता कि आप इस संबंध में करने के लिए बहुत है, भले ही सम्मिलित तेजी से होगा (सभी के लिए है सिद्ध हो), क्या आप एक सम्मिलन में एक अद्यतन को परिवर्तित कर सकते हैं ?! स्पष्ट रूप से मुझे नहीं लगता कि आप इसे हर समय कर सकते हैं।

एक आईएनएसईआरटी के दौरान आपको आमतौर पर कौन सी पंक्ति अपडेट करने की पहचान करने के लिए उपयोग करना पड़ता है लेकिन उस तालिका पर आपके सूचकांक के आधार पर ऑपरेशन की लागत कुछ हो सकती है।

अद्यतन के दौरान यदि आप किसी भी सूचकांक में शामिल किसी भी कॉलम को नहीं बदलते हैं तो आप त्वरित निष्पादन कर सकते हैं, अगर यह खंड आसान और तेज़ है।

पत्थरों पर कुछ भी लिखा नहीं गया है और वास्तव में मुझे लगता है कि यह पूरे डेटाबेस सेटअप, सूचकांक आदि पर निर्भर करता है।

Top 84 MySQL Performance Tips

+0

अपडेट की आवश्यकता है, कभी-कभी आप INSERT का उपयोग कर सकते हैं ... आंशिक रूप से INSERT द्वारा अद्यतन को अनुकरण करने के लिए आवेदन कुंजी अपडेट करें। लेकिन मेरा मानना ​​है कि उस मामले में MySQL INSERT करता है और फिर डुप्लिकेट होने पर अद्यतन करता है, तो आप दो प्रश्नों के साथ समाप्त हो जाएंगे जो एकल अद्यतन से धीमी होनी चाहिए। –

1

यह निर्भर करता है:

वैसे भी, एक संदर्भ के रूप इस एक मिल गया। एक सरल अद्यतन जो WHERE क्लॉज में प्राथमिक कुंजी का उपयोग करता है और केवल एक ही गैर-अनुक्रमित फ़ील्ड अपडेट करता है, उसी तालिका पर एक INSERT की तुलना में कम महंगा होगा। लेकिन यह भी शामिल डेटाबेस इंजन पर निर्भर करता है। एक अद्यतन जो कई अनुक्रमित क्षेत्रों को संशोधित करने में शामिल था, हालांकि, उस तालिका में INSERT की तुलना में अधिक महंगा हो सकता है क्योंकि अधिक सूचकांक कुंजी संशोधनों की आवश्यकता होगी। एक खराब निर्माण के साथ एक अद्यतन जहां लाखों रिकॉर्ड के टेबल स्कैन की आवश्यकता होती है, निश्चित रूप से उस तालिका में एक आईएनएसईआरटी की तुलना में अधिक महंगा होगा।

ये कथन कई रूप ले सकते हैं, लेकिन यदि आप अपने "मूल" रूपों में चर्चा को सीमित करते हैं जिसमें एक रिकॉर्ड शामिल होता है, तो लागत का बड़ा हिस्सा आमतौर पर इंडेक्स को संशोधित करने के लिए समर्पित होगा। प्रत्येक अनुक्रमित फ़ील्ड जिसे UPDATE के दौरान संशोधित किया गया है, में आम तौर पर दो मूल संचालन शामिल होते हैं (पुरानी कुंजी हटाएं और नई कुंजी जोड़ें) जबकि INSERT को एक की आवश्यकता होगी (नई कुंजी जोड़ें)। बेशक, एक क्लस्टर्ड इंडेक्स कुछ अन्य गतिशीलता जोड़ता है जैसे मुद्दों को लॉक करना, लेनदेन अलगाव इत्यादि। आखिरकार, इन बयानों के बीच सामान्य अर्थ में तुलना वास्तव में संभव नहीं है और संभवतः यदि यह वास्तव में विशिष्ट बयानों की बेंचमार्किंग की आवश्यकता होती है मायने रखता था।

आमतौर पर, सही कथन का उपयोग करने के लिए यह समझ में आता है और इसके बारे में चिंता न करें क्योंकि आमतौर पर यह अद्यतन और एक INSERT के बीच चयन करने का विकल्प नहीं है।

1

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

यह एकमात्र ऐसा विचार है जिसे मैं बता सकता हूं, क्योंकि प्रदर्शन डेटाबेस संगठन पर निर्भर करता है।

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

0

आप सामान्य रूप से INSERT और अद्यतन की तुलना नहीं कर सकते हैं। हमें एक उदाहरण दें (स्कीमा परिभाषा के साथ) और हम समझाएंगे कि किसके लिए अधिक खर्च होता है और क्यों। इसके अलावा, आप अपनी योजना और निष्पादन समय की जांच करके एक ठोस INSERT और एक अद्यतन को कम कर सकते हैं।

अंगूठे के कुछ नियम है, हालांकि:

  • आप केवल केवल एक क्षेत्र है, जो अनुक्रमित नहीं है अद्यतन करें और आप केवल एक रिकॉर्ड अपडेट करेंगे और आपको rowid/प्राथमिक कुंजी का उपयोग करने वाले रिकॉर्ड को खोजने के लिए तो यह अद्यतन खर्च होंगे अगर
  • एक आईएनएसईआरटी से कम, जो केवल एक पंक्ति को प्रभावित करेगा, हालांकि इस पंक्ति में कई नुकीले बाधित, अनुक्रमित फ़ील्ड नहीं होंगे; और उन सभी अनुक्रमित (जैसे एक नया पत्ता जोड़ने)
1

Sybase/एसक्यूएल सर्वर पर एक अद्यतन जो प्रभाव डालता है केवल-पढ़ने के सूचकांक के साथ एक कॉलम आंतरिक रूप से हटाएं और फिर एक डालने के द्वारा बदल दिया गया है, इसलिए बनाए रखा जाना है यह स्पष्ट रूप से डालने से धीमा है। मुझे अन्य इंजनों के लिए कार्यान्वयन नहीं पता है, लेकिन मुझे लगता है कि कम से कम सूचकांक शामिल होने पर यह एक आम रणनीति है। अब सूचकांक के बिना तालिकाओं के लिए (या किसी भी सूचकांक को शामिल नहीं अद्यतन अनुरोधों के लिए) मैं वहाँ मामलों में जहां अद्यतन, तेजी से हो सकता है तालिका की संरचना के आधार पर कर रहे हैं लगता है।

0

यहां मुख्य संसाधन डिस्क एक्सेस (आईओपीएस सटीक होना) है और हमें मूल्यांकन करना चाहिए कि इनमें से कौन से परिणाम कम से कम हैं।

दूसरों के साथ सहमति दें कि सामान्य जवाब देना असंभव कैसे है लेकिन कुछ विचार आपको सही दिशा में ले जाने के लिए, एक सरल कुंजी-मूल्य स्टोर मानते हैं और कुंजी अनुक्रमित होती है। सम्मिलन एक नई कुंजी डालने और अद्यतन मौजूदा कुंजी के मान को अद्यतन कर रहा है।

यदि यह मामला है (एक बहुत ही आम मामला), अद्यतन प्रविष्टि से तेज़ होगा क्योंकि अद्यतन में अनुक्रमित लुकअप शामिल है और इंडेक्स को छूए बिना मौजूदा मान बदल रहा है। आप मान सकते हैं कि एक डिस्क डेटा और संभवतः एक डिस्क लिखने के लिए पढ़ा जाता है। दूसरी ओर सम्मिलन में दो डिस्क इंडेक्स के लिए एक लिखेंगे, डेटा के लिए एक। लेकिन एक और छिपा लागत BTREE नोड बंटवारे और नए नोड निर्माण जो पृष्ठभूमि में क्या होगा, जबकि प्रविष्टि औसत के बारे में अधिक डिस्क का उपयोग करने के लिए अग्रणी है।

2

यदि आप एक बड़ी प्रसंस्करण (जैसे सेलुलर कंपनी के लिए रेटिंग या बिलिंग) करने की योजना बनाते हैं, तो इस सवाल का सिस्टम प्रदर्शन पर एक बड़ा प्रभाव पड़ता है।

कई नए टेबल और इंडेक्स बनाने के बड़े पैमाने पर अपडेट करने से मेरी कंपनी बिलिंग प्रक्रिया फॉर्म 26 घंटे से 1 घंटे कम हो गया है!

मैंने 100,000 ग्राहक के लिए 2 मिलियन रिकॉर्ड पर इसे आजमाया है। मैं पहली बार बिलिंग टेबल बनाया और उसके बाद हर ग्राहक सारांश कहता है, मैं अवधि, मूल्य, छूट .. 10 क्षेत्रों के कुल के साथ बिलिंग तालिका अपडेट किया गया।

दूसरा विकल्प में मैं 4 चरणों बनाया। प्रत्येक चरण पिछले तालिका (रों) पढ़ता है, सूचकांक बनाता है और का उपयोग कर (पूरा तालिका डालने के बाद): "चयन से में डालने .." मैं अगले चरण के लिए अगले टेबल बनाया है। 1. यह विकल्प 1. 2 से 4 समय तेजी से किया गया था:

सारांश हालांकि दूसरा विकल्प भी बहुत कुछ डिस्क स्थान (सभी दृश्य और अस्थायी तालिकाओं अंत में नष्ट कर दिया) वहाँ इस विकल्प के लिए 3 मुख्य लाभ कर रहे हैं की आवश्यकता है। यदि प्रक्रिया के मध्य में कोई समस्या थी तो मैं उस बिंदु से प्रक्रिया को शुरू कर सकता था, क्योंकि चरण की शुरुआत के लिए सभी टेबल तैयार थे और प्रक्रिया इस बिंदु से पुन: प्रारंभ हो सकती थी। यदि प्रक्रिया पहले विकल्प को लागू करने में विफल रही है, तो आपको फिर से सभी प्रक्रिया शुरू करने की आवश्यकता होगी। 3. यह विकास बना दिया है और क्यूए बहुत तेजी से काम के रूप में वे समानांतर काम कर सकता था।

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