ERT LOAD DATA INFILE ’सामान्य INSERT कथनों से अधिक तेज़ क्यों है?


22

मैंने एक लेख पढ़ा है जिसमें उल्लेख किया गया है कि हम कथन का उपयोग करके प्रति सेकंड 60,000 आवेषण प्राप्त कर सकते हैं LOAD DATA IN FILE, जो सीएसवी फ़ाइलों से पढ़ता है और एक डेटाबेस में डेटा सम्मिलित करता है।

यह सामान्य आवेषण से अलग क्यों होना चाहिए?

संपादित करें:
मैंने केवल एक INSERTबयान को कॉल करके राउंड-ट्रिप को कम कर दिया है:

INSERT INTO tblname
VALUES (NULL,2,'some text here0'),(NULL,2,'some text here1')
    ,(NULL,2,'some text here2'),(NULL,2,'some text here3')
    .....,(NULL,2,'some text here3000');

इस बारे में क्या?


मैंने मध्यम, बेंचमार्किंग विस्तारित आवेषण बनाम LOAD DATA INFILE: MySQL के साथ उच्च गति आवेषण पर एक लेख लिखा । नीचे पंक्ति: आप LOAD DATA INFILEविस्तारित आवेषण का उपयोग करने के प्रदर्शन का 65% प्राप्त कर सकते हैं । मुझे आधुनिक हार्डवेयर पर 240,000 आवेषण / सेकंड मिले।
बेंजामिन

जवाबों:


26

लोड डाटा इनइमर और विस्तारित INSERT प्रत्येक के अपने अलग फायदे हैं।

LOAD DATA INFILE एक एकल ऑपरेशन में टेबल डेटा के बड़े पैमाने पर लोडिंग के लिए डिज़ाइन किया गया है, साथ ही घंटी और सीटी बजाने के लिए:

  • प्रारंभिक रेखाएँ लंघन
  • विशिष्ट कॉलमों को छोड़ना
  • विशिष्ट कॉलम बदलना
  • लोड हो रहा है विशिष्ट कॉलम
  • डुप्लिकेट कुंजी मुद्दों को संभालना

पार्सिंग के लिए कम ओवरहेड की आवश्यकता होती है

दूसरी तरफ, यदि आप 1,000,000 पंक्तियों के बजाय केवल 100 पंक्तियों का आयात कर रहे हैं, तो विस्तारित INSERT समझदार है।

ध्यान दें कि mysqldump को डेटा के साथ-साथ टेबल डिज़ाइन के लिए विस्तारित INSERT के चारों ओर डिज़ाइन किया गया था क्योंकि यह प्रति INSERT सैकड़ों या हजारों पंक्तियों का इंजेक्शन करता है। लोड डाटा आईनॉर्म हमेशा स्कीमा और डेटा के बीच एक शारीरिक द्वंद्व बनाता है।

एक अनुप्रयोग बिंदु-से-दृश्य से, LOAD DATA INFILE भी विस्तारित INSERT की तुलना में स्कीमा परिवर्तन के लिए अधिक असंवेदनशील है।

LOAD DATA INFILE के उपयोग से कोई भी व्यक्ति अच्छे, बुरे और बदसूरत पर आगे-पीछे जा सकता है। कोई फर्क नहीं पड़ता कि आप किस तकनीक का उपयोग करते हैं, आपको हमेशा बल्क_इन्टर_बफ़र_साइज़ सेट करना चाहिए । क्यूं कर?

MySQL दस्तावेज़ीकरण के अनुसार बल्क_इन्टर_बफ़र_साइज़ पर:

MyISAM INSERT के लिए बड़ी मात्रा में ट्री-इन्सर्ट बनाने के लिए एक विशेष ट्री-जैसे कैश का उपयोग करता है ... चयन करें, INSERT ... VALUES (...), ... (...), और LOAD DATA INFILE जब nonempty में डेटा जोड़ते हैं। टेबल। यह चर बाइट ट्री के आकार को प्रति धागे बाइट्स में सीमित करता है। इसे 0 पर सेट करना इस अनुकूलन को अक्षम करता है। डिफ़ॉल्ट मान 8MB है।

सालों से, मैंने क्लाइंट को यह सेट नहीं करने के बाद क्लाइंट को देखा है और इसे 8 एमबी पर छोड़ दिया है। फिर, जब वे LOAD DATA INFILE का उपयोग करने या mysqldumps को आयात करने का निर्णय लेते हैं, तो वे कुछ गलत समझ सकते हैं। मैं आमतौर पर इसे मध्यम 256M पर सेट करने की सलाह देता हूं। कुछ मामलों में, 512M।

एक बार जब आपके पास एक बड़ा पर्याप्त थोक INSERT बफर होता है, तो तकनीक का उपयोग करके अकादमिक प्रदान किया जाता है और व्यक्तिगत पसंद के लिए उबलता है। उन अनुप्रयोगों के लिए जहां आप मांग पर सिर्फ 100 पंक्तियों में थोक करते हैं, विस्तारित INSERT के साथ चिपके रहते हैं।

सभी निष्पक्षता में, LOAD DATA INFILE तेजी से कह रहा है कि सामान्य INSERT स्टेटमेंट मुख्य रूप से लोड किए गए स्टेटमेंट की तरह है क्योंकि कॉन्फ़िगरेशन पर ध्यान नहीं दिया जाता है। भले ही आप LOAD DATA INFILE और विस्तारित INSERTs के बीच एक उचित बल्क_insert_buffer_size के बीच एक बेंचमार्क सेट करते हैं, प्रत्येक पंक्ति को पार्स करने पर सहेजे गए नैनोसेकेंड केवल LOAD DATA INFILE के पक्ष में नाममात्र परिणाम प्राप्त कर सकते हैं।

आगे बढ़ो और इसे my.cnf में जोड़ें

[mysqld]
bulk_inset_buffer_size=256M

विस्तारित INSERT लॉन्च करने से पहले आप इसे अपने सत्र के लिए भी सेट कर सकते हैं

SET bulk_insert_buffer_size= 1024 * 1024 * 256;

UPDATE 2012-07-19 14:58 EDT

चीजों को परिप्रेक्ष्य में रखने के लिए, बल्क इंसर्ट बफ़र केवल MyISAM तालिकाओं को लोड करने के लिए उपयोगी है, न कि InnoDB। मैंने थोक लोडिंग InnoDB पर एक और हालिया पोस्ट लिखा: हार्ड ड्राइव पर प्रतीक्षा कर रहे शिशु अटक से मैसकल लोड


4

अधिकांश डेटाबेस प्रबंधन प्रणालियों में बड़ी मात्रा में डेटा को जल्दी से लोड करने के लिए बल्क लोड की सुविधा है। एक INSERTस्टेटमेंट में प्रति स्टेटमेंट सामान की एक महत्वपूर्ण मात्रा होती है - लॉकिंग, ट्रांजेक्शन सीमांकन, संदर्भात्मक अखंडता जांच, संसाधनों का आवंटन, I / O जो कि प्रति स्टेटमेंट के आधार पर किया जाना है।

बल्क इंसट्रक्शन ऑपरेशंस प्रक्रिया को सुव्यवस्थित करते हैं इसलिए इस सामान में बहुत अधिक है, प्रति पंक्ति बहुत कम ओवरहेड। एक DBMS डालने के बयान की तुलना में जल्दी परिमाण के डेटा आदेश थोक कर सकते हैं।


3

व्यक्तिगत INSERTबयानों को पार्स करने और निष्पादित करने से सीएसवी फ़ाइल को कॉलम में विभाजित करने और उन्हें सीधे लोड करने की तुलना में बहुत बड़ा ओवरहेड किया जाता है।

प्रत्येक INSERTकथन को MySQL इंजन द्वारा व्यक्तिगत रूप से पार्स किया जाना चाहिए और वैधता के लिए जाँच की जानी चाहिए - इससे अतिरिक्त CPU संसाधनों की खपत होती है और इसके लिए अधिक क्लाइंट <> सर्वर राउंड-ट्रिप की भी आवश्यकता होती है। थोक लोडिंग के माध्यम से ऐसा होने की आवश्यकता नहीं है LOAD DATA INFILELOAD DATA INFILEएक खाली तालिका में लोड करने के लिए उपयोग करते समय होने वाले अनुकूलन भी हो सकते हैं । देखें इस लिंक अधिक जानकारी के लिए।


मेरे सवाल का EDIT हिस्सा देखें।
एएलएच

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