InnoDB

2012-03-01 11 views
24

मैं अस्थायी द्वारा एक InnoDB तालिका में थोक डालने तेजी लाने के लिए कोशिश कर रहा हूँ में सूचकांक को अक्षम कैसे अपनी अनुक्रमणिका को अक्षम करने:InnoDB

+-------+------+-------------------------------------------------------------+ 
| Level | Code | Message              | 
+-------+------+-------------------------------------------------------------+ 
| Note | 1031 | Table storage engine for 'mytable' doesn't have this option | 
+-------+------+-------------------------------------------------------------+ 
1 row in set (0.00 sec) 

:

ALTER TABLE mytable DISABLE KEYS; 

लेकिन यह एक चेतावनी देता है हम इंडेक्स को कैसे अक्षम कर सकते हैं?

थोक आवेषण करते समय सूचकांक का उपयोग करने से बचने के लिए क्या विकल्प हैं?

हम प्रक्रिया को कैसे तेज कर सकते हैं?

+0

आपके पास कितना डेटा है (पंक्तियों और गीगाबाइट के संदर्भ में)? और आप इसे कैसे लोड करते हैं? – zerkms

+0

लगभग 5 मिलियन पंक्तियां और लगभग 1.2 जीबी। धन्यवाद। – fanchyna

+0

संबंधित: http://stackoverflow.com/q/654594/632951 – Pacerier

उत्तर

26

क्या आपने निम्न का प्रयास किया है?

SET autocommit=0; 
    SET unique_checks=0; 
    SET foreign_key_checks=0; 

MySQL से संदर्भ https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

देखें धारा "थोक डाटा लोड हो रहा है युक्तियाँ"

+1

मैंने ऐसा करने की कोशिश की। लेकिन मुद्दा यह है कि कैसे पता होना चाहिए कि सूचकांक को निष्क्रिय या अक्षम किया गया है या नहीं? – fanchyna

+1

मुझे पता है कि "EXPLAIN" कथन "SELECT" कथन को समझने में मदद कर सकता है लेकिन 'लोड डेटा स्थानीय INFILE "कथन के बारे में क्या है? मुझे कैसे पता चलेगा कि इस आदेश को चलाने के दौरान इंडेक्स कब समाप्त हो गया है? धन्यवाद। – fanchyna

+0

@fanchyna, अक्षम/सक्षम कुंजी एक वैश्विक सेटिंग है, प्रति सत्र नहीं। [mysttable में दिखाएं कुंजी] का उपयोग करें (http://stackoverflow.com/questions/4980917/mysql-disable-keys/28667994#28667994) यह देखने के लिए कि इंडेक्स क्या हैं अक्षम या सक्षम किया जा रहा है। – Pacerier

24

वहाँ एक बहुत अच्छा कारण है कि आप एक InnoDB मेज पर DISABLE KEYS पर अमल नहीं किया जा सकता है; InnoDB को इसका उपयोग करने के लिए डिज़ाइन नहीं किया गया है, और MyISAM है।

आप एक लिखने ताला द्वारा निम्नलिखित एक MyISAM तालिका के लिए एक CREATE TABLE देखेंगे:

वास्तव में, यहाँ क्या होता है जब आप एक mysqldump पुनः लोड है।

सभी थोक आवेषण चलाने से पहले, ALTER TABLE ... DISABLE KEYS पर कॉल किया जाता है।

यह क्या करता है MyISAM तालिका में द्वितीयक अनुक्रमणिका बंद कर देता है।

फिर, थोक आवेषण किए जाते हैं। हालांकि यह किया जा रहा है, प्राथमिक कुंजी और MyISAM तालिका में सभी अद्वितीय कुंजी अक्षम हैं। UNLOCK TABLEs से पहले, सभी गैर-अद्वितीय इंडेक्स को रैखिक रूप से पुनर्निर्माण के लिए ALTER TABLE ... ENABLE KEYS पर कॉल किया जाता है।

आईएमएचओ इस ऑपरेशन को इनो डीबी स्टोरेज इंजन में कोडित नहीं किया गया था क्योंकि गैर-अद्वितीय इंडेक्स में सभी कुंजी gen_clust_index (उर्फ क्लस्टरर्ड इंडेक्स) से प्राथमिक कुंजी प्रविष्टि के साथ आती हैं। यह एक बहुत ही महंगा ऑपरेशन होगा क्योंकि गैर-अद्वितीय इंडेक्स बनाने के लिए गैर-अद्वितीय कुंजी से अटैच करने के लिए प्रत्येक अद्वितीय कुंजी को पुनर्प्राप्त करने के लिए ओ (एन लॉग एन) चलने का समय आवश्यक होगा।

इस के प्रकाश में, इनओडीबी तालिका पर DISABLE KEYS/ENABLE KEYS पर प्रयास करने के बारे में चेतावनी पोस्ट करना गैर-माईसैम स्टोरेज इंजन से जुड़े किसी विशेष मामले के लिए mysqldump को अपवादों को कोडिंग से कहीं अधिक आसान है।

+3

आपकी स्पष्टीकरण के लिए धन्यवाद, लेकिन सवाल अभी भी बना हुआ है: मैं डेटा अपलोड करते समय इंडेक्स का उपयोग करने से कैसे बच सकता हूं ताकि आयात समय की मात्रा को कम किया जा सके। धन्यवाद। – fanchyna

+1

क्या @RolandoMySQLDBA का अर्थ है कि आप नहीं करेंगे INNODB डेटाबेस पर इंडेक्स को अक्षम करके लोडिंग समय को सराहनीय रूप से कम करें। क्लस्टर्ड इंडेक्स पेड़-आधारित (= लॉग टाइम) डेटा संरचनाएं अपने दाहिने हिस्से में हैं; आपके विकल्प संपूर्ण इंडेक्स को nlogn पर बना रहे हैं, या एन लॉग इन चल रहे हैं serts। आप प्रति-सम्मिलित लागत में थोड़ा सा बचा सकते हैं लेकिन अभ्यास में मैं शर्त लगाता हूं कि यह बहुत छोटा है; पहले से ही अनुक्रमिक सम्मिलन अनुकूलन हैं। –

+1

मैं नियमित रूप से बहुत बड़ी इंडेक्स (सैकड़ों गीगाबाइट्स/10+ अलग-अलग इंडेक्स) के साथ बहुत बड़ी 'innodb' टेबल बनाते हैं)। निर्माण समय में भारी कमी आई है जब मैं बिना इंडेक्स वाले टेबल में 'INSERT' करता हूं। जाहिर है, "विशाल" आपकी तालिका के अंतिम आकार, इंडेक्स की संख्या और प्रकार, डेटा तत्वों के प्रकार आदि पर निर्भर करता है। मैं आम तौर पर प्राथमिक कुंजी के अलावा तालिका का निर्माण करता हूं (यदि आप बस लोड कर रहे हैं तो इसकी आवश्यकता नहीं है डेटा जिसमें पहले से ही प्राथमिक कुंजी आईडी है), और फिर अंत में इंडेक्स बनाएं। आपको 5 एमएम पंक्तियों और 1.5 जीबी पर कोई फर्क नहीं पड़ता है, लेकिन जैसे ही आपकी टेबल बढ़ती है, आप करेंगे। –

7

फिर से गणना के अनुक्रमित के लिए लागत को कम करने के लिए आप डेटा INFILE का उपयोग कर या Mysql मल्टी पंक्ति आवेषण का उपयोग कर, की तरह

सम्मिलित tbl_name जांच (ए, बी, सी) मान डेटा या तो डालूँ (1 , 2,3), (4,5,6), (7,8,9);

-> इसलिए एक बयान के साथ कई पंक्तियां डालना।

एक कथन के साथ कितनी पंक्तियां सम्मिलित हो सकती हैं max_allowed_packet mysql सेटिंग पर निर्भर करती है।

+1

क्या आप इस बारे में निश्चित हैं? तो क्या आप हमें ** एकल ** सम्मिलन कथन का उपयोग करके दस लाख पंक्तियां डालने के लिए कह रहे हैं? – Pacerier

+0

मैं आपको एक बयान के साथ "सभी डेटा" डालने के लिए नहीं कहता, लेकिन एक साथ कई पंक्तियों को सम्मिलित करने के लिए कहता हूं। मेरे ऐप्स में मैंने बिना किसी समस्या के 500-1000 पंक्तियों का उपयोग किया है। यह ज्यादातर पंक्तियों की संख्या और प्रति पंक्ति डालने वाले डेटा की मात्रा पर निर्भर करता है। – staabm

+0

तो एक अच्छी संख्या क्या है? क्या आप निर्णय लेते हैं कि परीक्षण और त्रुटि? – Pacerier

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