2012-06-06 11 views
11

GISTपुन: अनुक्रमण विशाल डाटाबेस (अंग्रेजी विकिपीडिया) कुशलतापूर्वक

अंग्रेजी विकिपीडिया के एक बड़े पैमाने पर 40 जीबी आयात कर से पहले, मैं अस्थायी रूप से (तीन तालिकाओं से अनुक्रमित और ऑटो वेतन वृद्धि क्षेत्रों को दूर करने के लिए किया था भार को संभालने के लिए 'पृष्ठ', 'संशोधन', और 'पाठ')। अब मैंने अंततः अंग्रेजी विकिपीडिया को अपनी स्थानीय मशीन पर सफलतापूर्वक आयात किया है और एक स्थानीय दर्पण (मीडियाविकि एपीआई) बनाया है। वाह!

हालांकि, अब मुझे एक दशक से भी कम समय में इंडेक्स और ऑटो-वृद्धि फ़ील्ड को फिर से बनाने की आवश्यकता है। सौभाग्य से, (1) मैंने इंडेक्स और फ़ील्ड को हटाए जाने से पहले phpmyadmin में प्रासंगिक तालिकाओं के बहुत सारे स्क्रीन-शॉट्स ले लिए थे; (2) मैं आयात से पहले किए गए कदमों के चरम परिशुद्धता के साथ समझा सकता हूं; और (3) यह MySQL में धाराप्रवाह किसी के लिए भी मुश्किल नहीं होना चाहिए। दुर्भाग्य से, मेरे पास MySQL में कोई विशेषज्ञता नहीं है, इसलिए "बच्चे के कदम" स्पष्टीकरण बेहद सहायक होंगे।

ठीक क्या मैं (आयात की तैयारी) DID:

कदम 1, 2, 3: इस छवि को इससे पहले कि मैं क्षेत्र 'बदलें' पर क्लिक करके PAGE_ID संशोधित दर्शाया गया है तालिका पेज और अन-जांच 'ऑटो-वृद्धि' (आयात करने की तैयारी में)। मैं क्षेत्र के लिए ठीक वही परिवर्तन प्रदर्शन तालिका में rev_id संशोधन और old_id तालिका मेंपाठ लेकिन अतिरेक से बचने के लिए स्क्रीन शॉट्स छोड़े गए।

table 'page' before modification of 'page_id'

चरण 4: इस छवि को तालिका पेज के लिए अनुक्रमणिका को दर्शाया गया है इससे पहले कि मैं उन सभी को गिरा दिया।

indexes for table 'page' before I dropped them

चरण 5: इस छवि को तालिका संशोधन के लिए अनुक्रमणिका को दर्शाया गया है इससे पहले कि मैं उन सभी को गिरा दिया।

indexes for table 'revision' before I dropped them

चरण 6: इस छवि को तालिका पाठ के लिए अनुक्रमणिका को दर्शाया गया है इससे पहले कि मैं उन सभी को गिरा दिया।

indexes for table 'text' before I dropped them

क्या मैं अब जरूरत है (आयात के बाद बहाल करने):

मैं सिर्फ एक सौ साल का इंतजार किए बिना मूल अनुक्रमित और ऑटो वेतन वृद्धि क्षेत्रों को बहाल करने की जरूरत है।

सेट-अप विवरण: पीएचपी 5.3.8 (apache2handler), MySQL 5.5.16 (InnoDB), अपाचे 2.2.21, Ubuntu 12.04 LTS, मीडियाविकि 1.19.0 (निजी विकि)

+1

+1 एक अच्छी तरह से लिखित प्रश्न के लिए +1 है, लेकिन मुझे इस आकार के डेटा सेट से डर है, इंडेक्स बनाने में कुछ समय लग रहा है इससे कोई फर्क नहीं पड़ता कि आप इसे कैसे करते हैं। यदि यह माईसाम था, तो आप आयात करने से पहले इंडेक्स को छोड़ने से बचा सकते थे: माईसाम टेबल में, आप उन्हें अक्षम कर सकते हैं और अपना डेटा आयात करने के बाद उन्हें फिर से सक्षम कर सकते हैं, इस मामले में MySQL स्वचालित रूप से सॉर्ट करके इंडेक्स की मरम्मत करेगा। लेकिन फिर भी, 40 जीबी डेटा को सॉर्ट करने के लिए एक तेज प्रणाली पर कुछ समय लग रहा है। और आप इनो डीबी का उपयोग कर रहे हैं, जिसमें यह एक संभावना AFAIK नहीं है। – Daan

+0

मुझे नहीं लगता कि एक नई अनुक्रमणिका बनाने से अक्षम और सक्षम करना तेज है। आप शून्य से शुरू करते हैं, डेटा को सॉर्ट करते हैं और इंडेक्स लिखते हैं। – usr

+0

याद रखें कि मैं एक पूर्ण MySQL नौसिखिया हूं। मुझे पता है कि मैंने क्या किया, लेकिन मुझे पता नहीं है कि कैसे सॉर्ट करना, पुनः इंडेक्स करना इत्यादि। इसलिए कोड के साथ समझाया गया तो यह बहुत उपयोगी होगा। यदि यह मायआईएसएएम का उपयोग करके अक्षम और सक्षम करने में सक्षम बनाता है तो मैं तेजी से फिर से अनुक्रमणित करता हूं, मैं हमेशा सबकुछ खरोंच से पुनर्निर्माण कर सकता हूं - मैंने इसे कई बार किया है, मैं इसे लगभग 5 घंटे में आसानी से कर सकता हूं। कुंजी यह है कि मैं MySQL के बारे में लगभग कुछ भी नहीं जानता, इसलिए कृपया विशिष्ट रहें और यदि संभव हो तो कोड उदाहरण प्रदान करें। –

उत्तर

4

मैं वास्तव में विकिपीडिया की तरह तो मैं मदद करने की कोशिश करूंगा।

आप वापस

ALTER TABLE page MODIFY COLUMN page_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; 

मैं आगे बढ़ने से पहले सभी तालिकाओं के लिए तालिका विवरण की जरूरत है

ALTER TABLE 

का एक बहुत उपयोग करने के लिए जोड़े प्राथमिक कुंजी

ALTER TABLE page ADD PRIMARY KEY (page_id); 
ALTER TABLE revision ADD PRIMARY KEY (rev_id); 
ALTER TABLE text ADD PRIMARY KEY (old_id); 

जोड़े ऑटो वेतन वृद्धि की जरूरत है। यदि rev_id और एक ही परिभाषाओं तो page_id रूप old_id हैं:

ALTER TABLE revision MODIFY COLUMN rev_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; 
ALTER TABLE text MODIFY COLUMN old_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; 

फिर अनूठी कुंजियाँ

ALTER TABLE page ADD UNIQUE name_title(page_namespace, page_title); 
ALTER TABLE revision ADD UNIQUE rev_page_id(rev_page, rev_id); 

अन्य अनुक्रमित

ALTER TABLE page ADD INDEX page_random(page_random); 
ALTER TABLE page ADD INDEX page_len(page_len); 
ALTER TABLE page ADD INDEX page_redirect_namespace(page_is_redirect, page_namespace, page_len); 
ALTER TABLE revision ADD INDEX rev_timestamp(rev_timestamp); 
ALTER TABLE revision ADD INDEX page_timestamp(rev_page, rev_timestamp); 
ALTER TABLE revision ADD INDEX user_timestamp(rev_user, rev_timestamp); 
ALTER TABLE revision ADD INDEX user_text_timestamp(rev_user_text, rev_timestamp); 

जोड़े हैं, एक कॉलम परिभाषाएँ कि इस सामग्री को बदल हो सकता है। आपको CREATE तालिका जानकारी प्रदान करने की आवश्यकता है।

+0

क्या यह आपका मतलब है? यह संशोधन तालिका http://imageshack.us/photo/my-images/38/revid.png/ है और टेक्स्ट तालिका http://imageshack.us/photo/my-images/ के शीर्ष पर दिखाई दे रही है 59/textindex.png/ यदि नहीं, तो मुझे कहां देखना चाहिए? मुझे अन्य स्क्रीन-शॉट्स का एक टन मिला है। –

+2

@BrianSchmitz Yup ने कुछ बदलाव किए और अब सब कुछ काम करना चाहिए। भविष्य में, phpmyadmin के स्क्रीनशॉट के बजाय "तालिका तालिका_नाम बनाएं" का उपयोग करें। – saccharine

+0

उत्कृष्ट। मुझे उम्मीद है कि पुन: अनुक्रमण में कुछ समय लगना चाहिए, लेकिन क्या आप यहां पर बात कर रहे प्रसंस्करण समय की परिमाण के क्रम के बहुत, बहुत मोटे बॉलपार्क guesstimate बनाने में सक्षम होंगे? घंटे? दिन? (मैं काफी बीफ़ी लैपटॉप पर सबकुछ कर रहा हूं।) यदि नहीं, तो मुझे समझ में आता है क्योंकि मुझे पता है कि मैंने ज्यादा जानकारी प्रदान नहीं की है। –

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