2010-01-18 13 views
13

मेरे पास चित्रों से भरा 12 जीबी टेबल है, मैं डेटा रखने वाले ब्लॉब कॉलम का नाम बदलने की कोशिश कर रहा हूं, और यह हमेशा के लिए ले रहा है। क्या कोई मुझे झटका खाते से झटका दे सकता है कि कॉलम का नाम बदलने में इतना समय क्यों लग रहा है? मैंने सोचा होगा कि यह ऑपरेशन बहुत तेज होगा, टेबल के आकार से कोई फर्क नहीं पड़ता?mysql में कॉलम का नाम बदलने में इतना समय क्यों लगता है?

संपादित करें: क्वेरी मैं भाग गया के रूप में

alter table `rails_production`.`pictures` change `data` `image_file_data` mediumblob NULL 

ऐसा लगता है कि समय के सबसे mysql चित्रों तालिका, जो बाद से यह बहुत बड़ी है की अस्थायी प्रतिलिपि बनाने के लिए के लिए इंतज़ार कर खर्च किया जाता है ले जा रहा है इस प्रकार है करने के लिए कुछ समय

यह डेटाबेस से फाइल सिस्टम में चित्र भंडारण को बदलने के लिए, चीजों की सूची में है।

EDIT2: सर्वर संस्करण: 5.0.51a-24 + lenny2 (डेबियन)

+1

सटीक क्वेरी आप दौड़ा पोस्ट करने के लिए एक अच्छा विचार हो सकता है। – nos

+1

शायद यही कारण है कि मैंने डीबी * में छवियों को स्टोर करने के तरीके के बारे में देखा है, आमतौर पर * फाइल सिस्टम में स्टोर छवियों और डीबी में छवियों के लिंक कहते हैं। – pavium

+0

@ जनक: आप MySQL का किस संस्करण का उपयोग कर रहे हैं? – outis

उत्तर

10

मैं आपको उड़ा-चढ़ाव नहीं दे सकता (सुविधा अनुरोध #34354 मदद करेगा, सिवाय इसके कि यह शायद MySQL 5.0 पर वापस नहीं भेजा जाएगा), लेकिन अतिरिक्त समय इस तथ्य के कारण है कि ALTER ... CHANGE कॉलम के प्रकार (और कॉलम विशेषताओं, यदि कोई हो) को बदल सकता है, जो कॉलम और अन्य चेक में संग्रहीत मानों को परिवर्तित करने की आवश्यकता है। MySQL 5.0 में नए प्रकार और गुण पुराने होने के समान अनुकूलन शामिल नहीं हैं। MySQL 5.0:

अधिकांश मामलों में, वैकल्पिक तालिका मूल तालिका की एक अस्थायी प्रति बनाकर काम करता है। प्रतिलिपि प्रतिलिपि पर की जाती है, और फिर मूल तालिका हटा दी जाती है और नया नाम बदल दिया जाता है। जबकि वैकल्पिक तालिका निष्पादित हो रही है, मूल तालिका अन्य सत्रों द्वारा पठनीय है। तालिका में अद्यतन और लिखने को तब तक रोक दिया जाता है जब तक कि नई तालिका तैयार न हो जाए, और उसके बाद स्वचालित रूप से बिना किसी असफल अपडेट के नई तालिका में रीडायरेक्ट हो जाते हैं।

[...]

आप किसी भी विकल्प का उपयोग करते RENAME के ​​अलावा अन्य तालिका को बदलने के लिए, MySQL हमेशा एक अस्थायी तालिका बनाता है, डेटा पूरी तरह से कॉपी करने के लिए (जैसे जब आप बदल के रूप में की जरूरत नहीं होगी, भले ही कॉलम का नाम)।

के तहत 5.1, ALTER कुछ अतिरिक्त अनुकूलन है:

कुछ मामलों में, कोई अस्थायी तालिका आवश्यक है:

  • बदलाव केवल तालिका मेटाडाटा को संशोधित कि और नहीं तालिका डेटा हो सकता है तालिका की .frm फ़ाइल को बदलने और तालिका सामग्री को छूने के तुरंत बाद बनाया गया।

    • एक कॉलम, InnoDB स्तोरागे engine के अलावा पुनः नामित करना: निम्न परिवर्तन तेजी से परिवर्तन कि इस तरह से बनाया जा सकता है कर रहे हैं।

[...]

+6

इनो डीबी स्टोरेज इंजन को छोड़कर, कॉलम का नाम बदलना। :( – pjb3

+0

अच्छा बिंदु pjb3। सुनिश्चित नहीं है कि यह मूल पोस्ट के बाद बदल गया है, लेकिन मैंने MySQL दस्तावेज़ को प्रतिबिंबित करने के लिए उत्तर संपादित किया है। जैसा कि आप कहते हैं, यह तकनीक innodb के लिए समर्थित नहीं प्रतीत होती है। – DougW

+0

मुझे एहसास है कि आपने यह उत्तर पोस्ट किया है 2010 में वापस, लेकिन तब से MySQL 5.6 ने कई नए मामले जोड़े हैं जहां यह जगह-जगह पर भी हो सकता है। http://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl देखें। एचटीएमएल –

7

जब आप स्कीमा परिवर्तन करने क्योंकि MySQL पूरे तालिका पुनर्निर्माण करेंगे।

ऐसा इसलिए किया जाता है क्योंकि कुछ मामलों में इसे करने का यह एकमात्र तरीका है, और यह सर्वर के लिए इसे फिर से पुनर्निर्माण करना अधिक आसान बनाता है।

2

हाँ mysql तालिका की एक अस्थायी प्रति करता है। मुझे नहीं लगता कि उसके आस-पास एक आसान तरीका है। आपको वास्तव में फाइल सिस्टम पर चित्रों को स्टोर करने और MySQL में केवल पथों को स्टोर करने के बारे में सोचना चाहिए। मुझे लगता है कि इसे तेज करने का यही एकमात्र तरीका है।

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