बड़ी mysql तालिकाओं में अनुक्रमणिका जोड़ना


13

मेरे पास एक टेबल है

| base_schedule_line_items | बनाएँ तालिका base_schedule_line_items(
idint (10) अहस्ताक्षरित नहीं AUTO_INCREMENT,
installmentint (10) अहस्ताक्षरित नहीं पूर्ण,
on_dateदिनांक नहीं, पूर्ण
actual_dateतिथि , पूर्ण दिनांक,
payment_typeपूर्णांक (11) नहीं पूर्ण,
scheduled_principal_outstandingदशमलव (65,0) नहीं पूर्ण,
scheduled_principal_dueदशमलव (65,0) नहीं पूरा,
scheduled_interest_outstandingदशमलव (65,0) नहीं पूर्ण,
scheduled_interest_dueदशमलव (65,0) पूर्ण नहीं,
currencyपूर्णांक (11) नहीं
updated_atपूर्ण, डेटाटाइम
created_atनहीं पूर्ण विवरण '2013-01-06 14:29:16', डेटाटाइम नहीं पूर्ण विवरण ' 2013-01-06 14:29:16 ',
loan_base_schedule_idint (10) अहस्ताक्षरित NULL,
lending_idint (10) अहस्ताक्षरित NULL,
rescheduleटिनीलिंट (1) DEFAULT' 0 ',
PRIMARY KEY ( id),
कुंजी index_base_schedule_line_items_loan_base_schedule ( loan_base_schedule_id), कुंजी index_bslt_spd( scheduled_principal_due), ...
कुंजी index_bslt_lending(lending_id),
कुंजी index_bslt_actualdate( actual_date),
कुंजी index_bslt_spsila ( loan_base_schedule_id, scheduled_principal_due, scheduled_interest_due, actual_date),
कुंजी index_bslt_ondate( on_date),
कुंजी index_bslt_oa( on_date, actual_date),
कुंजी index_bslt_ol( on_date, loan_base_schedule_id),
कुंजी index_bslt_oli( on_date, lending_id)
) इंजन = InnoDB AUTO_INCREMENT = 30,410,126 डिफ़ॉल्ट charset = UTF8 |

अब इस तालिका में 30 मिलियन रिकॉर्ड हैं, मुझे इसमें दो और इंडेक्स जोड़ने की जरूरत है और इसे जोड़ने में वर्षों लग जाते हैं।

परिवर्तन तालिका का आधार_संयुक्त_प्रतिष्ठित_ सूचकांक सूचकांक अनुक्रमणिका_बसाल_सला (अनुसूचित_प्रतिष्ठा_सूत्र, वास्तविक_दान, उधार_द) जोड़ें;
परिवर्तन तालिका का आधार_संपादित करें____प्रतिष्ठित सूचकांक अनुक्रमणिका_बसाल_सब्ला (अनुसूचित_प्रतिष्ठाप्रचार_दुः, शेड्यूल_डेंटेस्ट_ड्यू, लेंडिंग_ड, एक्चुअल_डेट) जोड़ें;

मैंने तालिका के आकार का पता लगाने के लिए नीचे दी गई क्वेरी का उपयोग किया

SELECT table_name AS "टेबल्स", राउंड ((data_length + index_length) / 1024/1024), 2) "साइज़ इन एमबी" FROM information_schema.TABLES WHERE table_schema = "my_database_name";

नतीजा जैसे ही सामने आया

base_schedule_line_items | 20111.00

मैंने इसका इस्तेमाल सिर्फ डेटा की लंबाई और इंडेक्स लंबाई को छोड़ने के लिए किया

SELECT table_name AS "टेबल्स", राउंड (((data_length) / 1024/1024), 2) "साइज़ इन एमबी" FROM से जानकारी_schema.TABLES WHERE table_schema = "my_dhemabase_name";

और परिणाम था

base_schedule_line_items | 9497.00

सूचकांक

कुंजी index_bslt_actualdate (actual_date),
कुंजी index_bslt_spsila (loan_base_schedule_id, scheduled_principal_due, scheduled_interest_due, actual_date),
कुंजी index_bslt_ondate (ON_DATE),
कुंजी index_bslt_oa (ON_DATE, actual_date),
कुंजी index_bslt_ol (ON_DATE, loan_base_schedule_id),
कुंजी index_bslt_oli (ON_DATE, lending_id)

मेरे द्वारा जोड़े गए थे, लेकिन मैं fsure नहीं हूं या किस उद्देश्य से अन्य सूचकांक जोड़े गए थे। यह काफी बड़ा एप्लिकेशन है। अब मुझे ऊपर वर्णित उन दो सूचकांकों को जोड़ने की आवश्यकता है क्योंकि वे मुझे एक चयन कथन का उपयोग करके एक रिपोर्ट निकालने में मदद करते हैं और मुझे उन्हें जोड़ना बहुत मुश्किल है। किसी भी तरह की सहायता का स्वागत किया जाएगा

जवाबों:


16

बड़े तालिकाओं को बदलने की गतिविधि चरणों में की जाती है:

  1. परीक्षण DB (सिर्फ संरचना) में आवश्यक फ़ील्ड और इंडेक्स के साथ एक नई तालिका बनाएँ
  2. मौजूदा तालिका से डेटा को डंप करें और टेस्ट डीबी में नए बनाए गए टेबल पर समान लोड करें
  3. अब अपने डाउनटाइम की घोषणा करें :)
  4. नाम बदलने से तालिकाओं को स्वैप करें - RENAME table ur_db.table_name to test.temp, test.table_name to ur_db.table_name, test.temp to test.table_name;यह एक परमाणु ऑपरेशन है जो एक दूसरे का अंश ले रहा है।
  5. नए बनाए गए तालिका में अतिरिक्त रिकॉर्ड लोड करें (डंपिंग और फिर लोडिंग के बाद आए रिकॉर्ड)। यह कदम आपके डाउनटाइम को कम करने के लिए एक बार चरण 3 से पहले भी किया जा सकता है।
  6. और आपका सिस्टम वापस आ गया है

कुछ नोट:

  1. आपको सूचना स्कीमा को सीधे इस तरह से हिट करने की आवश्यकता नहीं है, उपयोग करने का प्रयास करें SHOW TABLE STATUS from db like 'table_name'
  2. परिवर्तन तालिका की गति कम या ज्यादा आई / ओ गति के साथ जुड़ी हुई है। पिछली बार जब हमने एक प्रत्यक्ष परिवर्तन तालिका (उपरोक्त चरणों के बिना) चलाई थी, तो हमारे पास 40GB + तालिका आकार था जो लगभग 4hours ले गया था। यदि आपके 20GB डेटा में सालों लग रहे हैं, तो आप किसी पुरानी मशीन पर काम कर रहे हैं।
  3. अनचाहे इंडेक्स को भी छोड़ दें जैसे index_bslt_ondate, index_base_schedule_line_items_loan_base_scheduleकुछ अन्य इंडेक्स में इंडेक्स किए गए कॉलम के रूप में सबसे बाएं कॉलम हैं

कृपया मुझे बताएं कि क्या आपको इनमें से किसी भी कदम पर स्पष्टीकरण की आवश्यकता है।

संपादित करें: प्रक्रिया को स्वचालित करने के लिए एक सरल अजगर स्क्रिप्ट https://github.com/georgecj11/hotswap_mysql_table.git


10

आप अपने एप्लिकेशन को ब्लॉक किए बिना इंडेक्स को जोड़ने के लिए pt-online-schema-change जैसे टूल का उपयोग कर सकते हैं । मूल तर्क इस प्रकार है:

  • नए सूचकांक के साथ तालिका की खाली प्रतिलिपि बनाएँ
  • मौजूदा तालिका में ट्रिगर्स जोड़ें ताकि तालिका को हिट करने वाली कोई भी परिवर्तन तालिका की प्रतिलिपि पर लागू हो जाए *
  • पुरानी तालिका से नई तक पंक्तियों की प्रतिलिपि बनाना शुरू करें
  • एक बार नकल पूरी हो जाने के बाद, टेबल को स्वैप करें
  • पुरानी मेज को गिरा दो

* यदि मेज पर मौजूदा ट्रिगर मौजूद हैं तो टूल काम नहीं करता है

स्वैपिंग और ड्रॉपिंग व्यवहार को उपकरण को दिए गए विकल्पों के आधार पर समायोजित किया जा सकता है।

इसके अलावा, विदेशी कुंजी के साथ समस्याएँ हैं, इसलिए उपकरण के प्रलेखन को पूरी तरह से समझने के लिए सुनिश्चित करें कि यह क्या कर रहा है।

और निश्चित रूप से, यह सुनिश्चित करने के लिए बुद्धिमान है कि यदि आवश्यक हो तो आप पुनर्स्थापित करने में सक्षम होने के लिए तालिका का बैकअप लें।

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