2011-12-12 12 views
5

मैं MySql डेटाबेस में 20 मिलियन रिकॉर्ड सम्मिलित करने के लिए:एक डेटाबेस तालिका में नीचे की तरह के रूप में तेजी से संभव के रूप में

create table temperature 
(id int unsigned not null auto_increment primary key, 
temperature double 
); 

और मेरे कार्यक्रम में मैं तालिका में डालने के लिए लगभग 20 लाख तापमान मिला है। मैं .NET पर्यावरण में काम करता हूं, MySQL से कनेक्टर/नेट कनेक्टिंग का उपयोग करता हूं। कोड नीचे जैसा था:

List<double> temps = new List<double>(); 
... 
string connStr = "server=localhost;user=name;database=test;port=3306;password=*****;"; 
MySqlConnection conn = new MySqlConnection(connStr); 
try 
{ 
    conn.Open(); 

    //temps.Count is about 20 million 
    for (int i = 0; i < temps.Count; i++) 
    { 
     string sql1 = "INSERT INTO temperature VALUES (null, "+temps[i]+")"; 
     MySqlCommand cmd1 = new MySqlCommand(sql1, conn); 
     cmd1.ExecuteNonQuery(); 
    } 

} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.ToString()); 
} 
conn.Close(); 

मैं जितनी जल्दी हो सके इतने सारे लाइन डेटा कैसे डाल सकता हूं? (यह केवल मेरे कंप्यूटर में 2000 के रिकॉर्ड हर मिनट सम्मिलित कर सकते हैं।)

+1

मैं थोड़ा उत्सुक हूँ। आप डीबी में 20 लाख तापमान क्यों डालेंगे? –

+0

क्या आपको autoincrement की आवश्यकता है? मेरे पास एक समान स्थिति है (एसक्यूएल सर्वर पर) और मैं लोडर पर वृद्धि कुंजी क्लाइंट पक्ष का प्रबंधन करता हूं। मैं अपने वर्तमान हार्डवेयर पर प्रति सेकंड 75.000 पंक्तियों को मिलाता हूं। कोई एसक्यूएल, हालांकि ... – TomTom

+0

इसके अलावा आपका एसक्यूएल "बेकार" है;) क्या आप एक रन में एकाधिक सम्मिलन विवरण सबमिट नहीं कर सकते हैं? यह एक स्ट्रिंग है - क्या MySQL संभाल सकता है? प्रति राउंड ट्रिप 10 10 राउंड ट्रिप यात्रा है। थ्रेड उस (मूर थ्रेडेड लोड) में moer जोड़ते हैं। – TomTom

उत्तर

5

आप bulk insert की अवधारणा जो ExecuteNonQuery कई बार बुलाने की भूमि के ऊपर कम से कम एक ही समय में कई आवेषण कार्यान्वित उपयोग कर सकते हैं।

MySQL में इस LOAD DATA कहा जाता है, विवरण के लिए यहां की जाँच करें: http://dev.mysql.com/doc/refman/5.5/en/load-data.html

इस bulk insert कहा जाता है और यह इस तरह के रूप में जाना जाता है एमएस एसक्यूएल सर्वर में, यही कारण है कि मैं इसे इस नाम के साथ उल्लेख किया गया है।

0

सामान्य नियम: -

  1. use load data infile
  2. आयात के दौरान अक्षम कुंजी है, यह सभी डेटा के बाद वापस सक्षम आयात किया गया है
  3. डेटाबेस सर्वर में ही स्क्रिप्ट चलाने, टीसीपी के बजाय सॉकेट का उपयोग कर कनेक्ट/आईपी

अधिकांश युक्तियाँ दस्तावेज़ीकरण में समझाई गई हैं।

+0

सामान्य नियम # 2 यहां लागू नहीं होगा, क्योंकि यह ऑटोनंबर प्राथमिक कुंजी है –

1

आपको थोक आवेषण करना चाहिए। ऐसा करने के लिए ADO.NET तरीका DataAdapter का उपयोग कर है।

एक MySQL विशिष्ट समाधान के लिए, MySqlBulkLoader का उपयोग करें।

4

थोक आवेषण अनुकूलित करने के कई तरीके हैं। कुछ हैं:

  • LOAD DATA INFILEwrapper API for .NET है। यह सबसे तेज़ तरीका है, लेकिन सरल प्रविष्टियों से कुछ सीमाएं और अर्थपूर्ण मतभेद हैं।

  • बहु-पंक्ति INSERT बयान:

    INSERT INTO temperature (temperature) VALUES (1.0), (2.0), (3.0), ...

    आप एक बार में 20.000.000 पंक्तियां सम्मिलित नहीं करना चाहिए, लेकिन एक बहुत बड़ी गति-अप के लिए 1.000-10.000 की कोशिश करना चाहते हो सकता है। यह गति बढ़ाने के लिए एक सरल और बहुत ही असंभव तरीका है। 10 का एक कारक और कभी-कभी रास्ता अक्सर संभव होता है।

  • तालिका को लॉक करना (LOCK TABLES)।

  • सूचकांक अस्थायी रूप से अक्षम करना।

  • MySQL विकल्प ट्यूनिंग।

  • INSERT DELAYED (सबसे नहीं संभावना है कि यहाँ उपयोगी)।

प्रलेखन आप विकल्पों पर more elaborate detail देता है। कुछ विकल्प तालिका प्रकार (InnoDB बनाम MyISAM) पर निर्भर हैं।

एक सामान्य सुझाव: हमेशा स्तंभ आपके VALUES के सामने डालने निर्दिष्ट करें। यह अधिक रखरखाव कोड के लिए बनाता है।

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

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