मैं कभी ALGORITHM = COPY को ALGORITHM = INPLACE क्यों पसंद करूंगा?


16

के बाद से MySQL 5.6 ऑनलाइन DDL शुरू की, ALTER TABLEआदेश वैकल्पिक रूप से या तो हो सकता है ALGORITHM=INPLACEया ALGORITHM=COPYनिर्दिष्ट। ऑनलाइन DDL नोटों का अवलोकन , जो डिफ़ॉल्ट रूप से, INPLACEजहां भी संभव हो , का उपयोग किया जाता है, और इसका अर्थ है (कभी भी इसे काफी बताते हुए) कि INPLACEएल्गोरिथ्म एक से सस्ता COPYहै।

तो मुझे कभी ALGORITHM=COPYकिसी ALTER TABLEकथन पर क्या कारण बताना होगा ?


यदि आप COPY का उपयोग करते हैं तो मेज पर अनुक्रमित क्या होता है? क्या आप एक नई तालिका बनाए जाने और खरोंच से आबाद होने के कारण डीफ़्रैग्मेन्टेड इंडेक्स के साथ समाप्त होते हैं?
डेव पोले

अगर COPY स्क्रैच से पॉप्युलेट होता है, तो यह एक धीमा विकल्प है, क्योंकि परिणामी तालिका डीफ़्रेग्ड इंडेक्स के कारण बेहतर प्रदर्शन कर सकती है।
डेव पोले

@DavePoole अच्छा सिद्धांत है, लेकिन मुझे संदेह है कि यह निशान से दूर है OPTIMIZE TABLE(जो मुझे लगता है कि इसके उद्देश्य के एक बड़े हिस्से के रूप में अनुक्रमित डीफ़्रैगिंग है ) ALGORITHM=INPLACEMySQL 5.7.4 के रूप में उपयोग करता है । तो मुझे लगता है यह मामला है कि, हाँ, है COPY करता है defrag अनुक्रमित है, लेकिन ऐसा नहीं करता हैINPLACE (किसी भी तरह), का एक संभावित लाभ के रूप में यह समाप्त करते हुये COPY
मार्क अमेरी

2
"MySQL 5.6 से पहले बनाई गई InnoDB टेबल्स उन तालिकाओं के ALTER TABLE ... ALGORITHM=INPLACEलिए समर्थन नहीं करती हैं , जिनमें अस्थायी कॉलम (DATE, DATETIME या TIMESTAMP) शामिल हैं और जिनका उपयोग करके पुनर्निर्माण नहीं किया गया है ALTER TABLE ... ALGORITHM=COPY..." ऑनलाइन DDL की सीमाएँ
JSapkota

जवाबों:


10

हां, ऐसे मामले हैं जब आप निर्दिष्ट कर सकते हैं COPY, लेकिन यह प्रदर्शन के अलावा अन्य कारणों से होगा।

यह समझना महत्वपूर्ण है कि MySQL ने नई सुविधा - संस्करण 5.6 में ऑनलाइन DLL प्रसंस्करण की शुरुआत की। इसने ऑफ़लाइन प्रसंस्करण को नहीं हटाया। इसलिए इन 2 तरीकों में अंतर करने की आवश्यकता है:

  1. कुछ ऑपरेशन अभी भी ऑफ़लाइन मोड में ही काम करते हैं। तालिका 15.10, “ DDL संचालन के लिए ऑनलाइन स्थिति का सारांशDDL संचालन की एक सूची के लिए जिसे इन-प्लेस किया जा सकता है या नहीं किया जा सकता है।

  2. ऑनलाइन और ऑफलाइन मोड में संचालन थोड़ा अलग व्यवहार है, इसलिए आप संगतता कारणों से "पुराना" चुन सकते हैं।

कुछ उदाहरण (कृपया और सुझाव दें):

  1. MySQL 5.6 से पहले बनाई गई InnoDB टेबल्स उन तालिकाओं के ALTER TABLE ... ALGORITHM=INPLACEलिए समर्थन नहीं करती हैं जिनमें टेम्पोरल कॉलम ( या DATE, ) शामिल हैं और जिनका उपयोग करके पुनर्निर्माण नहीं किया गया है । इस स्थिति में, एक ऑपरेशन त्रुटि देता है।DATETIMETIMESTAMPALTER TABLE ... ALGORITHM=COPYALTER TABLE ... ALGORITHM=INPLACE

  2. ADD PRIMARY KEYCOPY modeखामोशी से खंड NULLउस डेटा प्रकार (INT के लिए 0, varchar के लिए रिक्त स्ट्रिंग) के लिए डिफ़ॉल्ट मानों में परिवर्तित हो जाता है, जबकि IN_PLACEऐसा नहीं होता है।

ALGORITHM = COPY क्लॉज के साथ, प्राथमिक कुंजी कॉलम में NULL मानों की उपस्थिति के बावजूद ऑपरेशन सफल होता है; डेटा को चुपचाप बदल दिया जाता है, जिससे समस्याएं हो सकती हैं।

पसंद करने का दूसरा कारण COPY:

संचालन जिसके लिए आप ALGORITHM = COPY या old_alter_table = 1 निर्दिष्ट करते हैं, विशेष परिदृश्यों में सटीक पिछड़े-अनुकूलता के लिए यदि आवश्यक हो तो तालिका-प्रतिलिपि व्यवहार को बाध्य करने के लिए।

हालांकि MySQL मैनुअल वास्तविक परिदृश्यों के बारे में बात नहीं करता है, आप कुछ कल्पना कर सकते हैं। जैसे कि डेवलपर ALTER INDEXऑपरेशन के दौरान लॉक की जा रही टेबल पर निर्भर होता है, इसलिए टेबल केवल पढ़ने के लिए या पूरी तरह से लॉक होती है और एक ऐसी प्रक्रिया होती है जो इंडेक्स पुनर्निर्माण के दौरान स्टेटिक टेबल को पढ़ती है।


1
मुझे लगता है कि लोग ALGORITHM=INPLACE"यह ऑनलाइन डीडीएल है और डेटाबेस को लॉक नहीं करेंगे" के साथ भ्रमित करते हैं , जब वास्तव में, वे वास्तव में उपयोग करना चाहते हैं LOCK=NONE
ब्रेंडन बायर्ड

2

@ स्टोलग का शायद सबसे अच्छा जवाब है, लेकिन यहां एक और है। यह एक शिक्षित अनुमान है कि =COPYअगर कोई गंभीर बग था , तो डेवलपर्स ने बच निकलने के रूप में छोड़ दिया =INLINEALTERयदि नई सुविधा टूट जाती है, तो भी यह उपयोगकर्ताओं को उपयोग करना जारी रखेगा ।

मैंने वर्षों में इस तरह की चीजों (झंडे sql_mode, my.cnfसेटिंग्स, आदि) में देखा है। नई रिलीज का इरादा स्पष्ट रूप से नई, बेहतर, सुविधा को सामने लाना है।

ऑप्टिमाइज़ेशन फ़्लैग इस श्रेणी में आते हैं, लेकिन पिछली कार्रवाइयों पर लटकने के और भी कारण हैं - ऑप्टिमाइज़र हमेशा "गलत तरीके से" करेगा; बस बहुत सारी संभावनाएं हैं।


1
आप इसे "पिछड़ी संगतता" के बजाय "एस्केप हैच" क्यों कहेंगे? हालाँकि इसमें बहुत अंतर नहीं हो सकता है;)
स्टोलग

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

-1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.