2012-06-25 12 views
15

करने के लिए एक मेज से सभी रिकॉर्ड की प्रतिलिपि वहाँ एक और अधिक-कुशल, एक मेज से दूसरे में सभी रिकॉर्ड को कॉपी करने की कम श्रमसाध्य तरह से है कि यह कर रहा है:MySQL कुशलता से एक और

INSERT INTO product_backup SELECT * FROM product 

आमतौर पर, product तालिका का आयोजन करेगा लगभग 50,000 रिकॉर्ड। दोनों टेबल संरचना में समान हैं और उनमें 31 कॉलम हैं। मैं यह इंगित करना चाहता हूं कि मेरा डेटाबेस डिज़ाइन नहीं है, मुझे विरासत प्रणाली मिली है।

+5

मैं सोचता है कि यह सबसे अच्छा तरीका है। इस तरह आप इंडेक्स को भी संरक्षित कर रहे हैं। –

+1

स्पीडवाइज जितना अच्छा हो उतना अच्छा है। जब तक सभी डेटा कॉपी नहीं किए जाते हैं, तब तक आप बैकअप तालिका पर इंडेक्स सृजन को रोक सकते हैं, इससे सम्मिलन की गति में काफी वृद्धि होगी। – fvu

+0

यह दिलचस्प है, धन्यवाद। मैं डेटा की प्रतिलिपि के बारे में जानबूझकर था और सोच रहा था कि क्या यह डेटाबेस पर एक नाली थी ('चयन *' ने मुझे फेंक दिया, या अगर क्वेरी का निर्माण करने के तरीके में प्रक्रिया करने में लंबा समय लगेगा)। यदि यह डेटा को कॉपी करने का एक स्वीकार्य तरीका है तो यह ठीक है। – crmpicco

उत्तर

9

मुझे लगता है कि यह एक तालिका से दूसरे तालिका में रिकॉर्ड कॉपी करने का सबसे अच्छा तरीका है। इस तरह आप लक्ष्य तालिका के मौजूदा इंडेक्स को भी संरक्षित कर रहे हैं।

1

मुझे नहीं लगता कि यह 50k तालिका के लिए योग्य होगा लेकिन: यदि आपके पास डेटाबेस डंप है तो आप इससे एक तालिका पुनः लोड कर सकते हैं। यदि आप एक एसईडी कमांड के साथ डंप में तालिका नाम को बदल सकता है आप एक और एक में एक टेबल लोड करना चाहते हैं के रूप में: यहाँ आप कुछ संकेत है: http://blog.tsheets.com/2008/tips-tricks/mysql-restoring-a-single-table-from-a-huge-mysqldump-file.html

एक वैकल्पिक (अपने डिजाइन के आधार पर) चलाता उपयोग करने के लिए किया जाएगा मूल तालिका पर सम्मिलित होता है ताकि डुप्लिकेट तालिका डेटा भी प्राप्त हो।

और एक बेहतर विकल्प एक और MySQL उदाहरण बनाना होगा और या तो इसे मास्टर-गुलाम कॉन्फ़िगरेशन में या दैनिक डंप मास्टर/लोड गुलाम फैशन में चलाया जाएगा।

4
mysqldump -R --add-drop-table db_name table_name > filepath/file_name.sql 

यह एक बूंद के विकल्प के साथ निर्दिष्ट तालिकाओं का एक डंप ले जब आप इसे आयात मौजूदा तालिका हटाना होगा। फिर करें,

mysql db_name < filepath/file_name.sql 
+0

मुझे यह जोड़ना चाहिए था कि मैं इसे PHP कोड में कर रहा हूं। यह INSERT की एक श्रृंखला से पहले किया जाएगा और UPDATEs को 'उत्पाद' तालिका पर किया जाता है, इसलिए मैं इसे MySQL व्यवस्थापन कार्यों के बजाय PHP कोड में करना चाहता हूं। – crmpicco

12

केवल एक चीज है जो आप गायब हैं। विशेष रूप से, अगर आप InnoDB का उपयोग कर रहे हैं, तो आप स्पष्ट रूप से अपने SELECT कथन में खंड एक ORDER BY जोड़ने के लिए सुनिश्चित करने के लिए आप प्राथमिक कुंजी में पंक्तियों डालने रहे हैं चाहते है (संकुल इंडेक्स) आदेश:

INSERT INTO product_backup SELECT * FROM product ORDER BY product_id 

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

LOCK TABLES product_backup WRITE; 
LOCK TABLES product_id READ; 
INSERT INTO product_backup SELECT * FROM product ORDER BY product_id; 
UNLOCK TABLES; 

ताला सामान शायद एक बड़ा फर्क नहीं होंगे पंक्ति ताला के रूप में:

अंत में, यदि आप InnoDB का उपयोग कर रहे, पंक्ति ताले कि आवश्यकता होती है और सिर्फ स्पष्ट रूप से दोनों तालिकाओं ताला की संख्या को कम बहुत तेज़ है (हालांकि टेबल लॉक के रूप में तेज़ नहीं है), लेकिन जब से आपने पूछा था।

+0

मैं माईसाम इंजन का उपयोग कर रहा हूं। मैंने पहले की पोस्ट में उल्लेख किया था कि मुझे विरासत प्रणाली मिली है, इसलिए यह इस समय के लिए मायिसम है। – crmpicco

+0

ऑर्डर नहीं कर सका जो एक इंडेक्स पेड़ बना सकता है जो असंतुलित है? प्राथमिक कुंजी के लिए किस मामले में यादृच्छिक आदेश बेहतर हो सकता है? –

+0

@ डैनीस्टैपल, माईसाम के साथ सॉर्ट किए गए क्रम में इंडेक्स में डालने पर पेड़ फ्लैट होता है। यह प्रदर्शन में सुधार करता है (सूचकांक पुनर्निर्माण नहीं कर रहा है), साथ ही अंतरिक्ष बचाता है। [MySQL दस्तावेज़ीकरण] से (http://dev.mysql.com/doc/refman/5.0/en/myisam-storage-engine.html): "जब क्रमबद्ध क्रम में पंक्तियां डाली जाती हैं (जैसे कि जब आप एक ऑटोऑक्रिकमेंट कॉलम का उपयोग कर रहे हों), इंडेक्स पेड़ विभाजित है ताकि उच्च नोड में केवल एक कुंजी हो। इससे इंडेक्स पेड़ में अंतरिक्ष उपयोग में सुधार होता है। " –

1

DROP गंतव्य तालिका:

DROP TABLE DESTINATION_TABLE; 
CREATE TABLE DESTINATION_TABLE AS (SELECT * FROM SOURCE_TABLE); 
+0

क्या होगा यदि गंतव्य तालिका में पहले से मौजूद डेटा है जो ओपी संरक्षित करना और जोड़ना चाहता है? – Martin

+0

गंतव्य_टेबल से हटाए जाने के बजाय तालिका ड्रॉप और बनाएं क्यों; गंतव्य_टेबल में * उत्पाद से चुनें? कौन सा अधिक कुशल है? –

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