2011-06-03 89 views
5

मेरे पास 134675+ मानों के साथ एक सरणी है, मुझे उन्हें अपनी mySQL तालिका में डालने की आवश्यकता है। मैं PHP और mySQL डेटा सम्मिलन के साथ काम करने के लिए इसमें आवश्यक सभी चीजें जानता हूं। क्या कोई तेज विधि है जो मुझे इन सभी मानों को रिमोट सर्वर पर 30-60 सेकंड के भीतर डालने देगी? क्योंकि जब मैं इसे foreach विधि से आजमा रहा हूं, तो पृष्ठ समय समाप्त हो रहा है। रिमोट सर्वर डीबी कनेक्शन 60 सेकंड से अधिक समय तक जारी रखने की इजाजत नहीं दे रहा है। मुझे नहीं पता क्यों। तो कृपया मुझे एक तेज तर्क के साथ मदद करें।दूरस्थ डेटाबेस में 134675 मानों को सम्मिलित करने का सबसे तेज़ तरीका

foreach($array as $value) 
{ 
    $sql="insert into collected values('".$value."')"; 
    $res=mysql_query($sql); 
    //then some extra code. 
} 

नोट मैं न सर्वर पर इतने सारे पहुँच विशेषाधिकार हैं:

यहाँ कुछ कोड मैं करने की कोशिश की है। मेरा डीबी खाता केवल मूल्यों को सम्मिलित कर सकता है और उससे भी कुछ भी नहीं। और यह mySQL डीबी पर एक बाधा है। मैं सीएसवी या किसी अन्य चीज का उपयोग नहीं कर सकता।

+0

आप शायद नहीं कई सम्मिलित करें कि भेजने के लिए सक्षम होने के लिए जा रहे हैं बयान इतनी जल्दी।क्या आपने कनेक्शन को बंद करने के लिए या तो बंद होने पर कनेक्शन को फिर से खोलने के लिए डेटाबेस सर्वर को कॉन्फ़िगर करना माना है? – geoffspear

+0

सर्वर को कॉन्फ़िगर करने के लिए मेरे हाथ में नहीं है। क्योंकि मेरे पास निजीकरण नहीं है। तो वैकल्पिक सोलन क्या है? –

+0

तैयार कथन का उपयोग करना शायद एक अच्छा विचार भी है, न सिर्फ इसलिए कि यह एसक्यूएल इंजेक्शन से बच जाएगा। – geoffspear

उत्तर

15

आप अपने लूप mysql_ping() फ़ंक्शन में शामिल कर सकते हैं। यह फ़ंक्शन यह सुनिश्चित करने के लिए जांच करता है कि कनेक्शन खुला है, और यदि यह नहीं है, तो यह फिर से कनेक्ट हो जाता है।

foreach($array as $value) { 
    mysql_ping($dbconn); 
    $sql="insert into collected values('".$value."')"; 
    $res=mysql_query($sql); 
    //then some extra code. 
} 

संपादित:

अपने स्वयं के उदाहरण का उपयोग करना, आप की तरह कुछ कर सकता है ऐसा लगता है कि डॉक्स के अनुसार, MySQL 5.0.14 के बाद, पीएचपी स्वचालित रूप से फिर से कनेक्ट नहीं करता है। आप MySQL के एक नए संस्करण का उपयोग करते हैं तो आप शायद इस तरह अपने खुद के संबंध तर्क में डालने के लिए, होगा (मैं परीक्षण नहीं किया):

function check_dbconn($connection) { 
    if (!mysql_ping($connection)) { 
     mysql_close($connection); 
     $connection = mysql_connect('server', 'username', 'password'); 
     mysql_select_db('db',$connection); 
    } 
    return $connection; 
} 

foreach($array as $value) { 
    $dbconn = check_dbconn($dbconn); 
    $sql="insert into collected values('".$value."')"; 
    $res=mysql_query($sql, $dbconn); 
    //then some extra code. 
} 
+0

इस सरल और अद्भुत जवाब के लिए धन्यवाद। यह मेरे लिए काम कर रहा है। सभी जय @galador –

+0

यह एक अच्छा जवाब है। इन बाधाओं को पाने के लिए इसका इस्तेमाल कभी नहीं किया। –

3

मुझे लगता है कि यदि आप अपने मूल्यों को एक सीएसवी फ़ाइल में डालते हैं तो बेहतर होगा और आप लोड डेटा सिंटैक्स का उपयोग करेंगे।

संपादित करें। उदाहरण

एक बार जब आप अपनी मेज संरचना

create table mytest (
id int not null auto_increment primary key, 
myvalue varchar(50) 
) engine = myisam; 

बनाते हैं और अपने txt फ़ाइल अपलोड आप इस

की तरह कुछ कर सकते हैं मान लें कि आप अपने सभी मूल्यों

value1 
value2 
value3 
and so on 

के साथ एक txt फ़ाइल करते हैं

load data infile 'myfile.txt' 
into table mytest (myvalue); 
+1

क्या आप अपना बयान साबित करने के लिए कुछ उदाहरण प्रदान कर सकते हैं? –

+0

कृपया मेरे प्रश्न का नोट हिस्सा देखें जो मैंने अभी प्रदान किया है। –

+1

क्या आप वाकई लोड डेटा का उपयोग नहीं कर सकते हैं? बहुत सारे सम्मिलित प्रश्नों को करने के बजाय आप एक बहु सम्मिलित क्वेरी का उपयोग कर सकते हैं। टेबल (your_field) मान (x), (y), (z) में डालने जैसा कुछ ... यह आपकी विधि से तेज़ है। –

0

मुझे लगता है कि @ निक का जवाब सबसे अच्छा है - लेकिन वैकल्पिक विकल्प शायद एसक्यूएल लिखना है एन एसपी जो सभी आवेषणों को सूचीबद्ध करता है, यानी एक बड़ी स्ट्रिंग के रूप में, उसे तार में भेज दें, एसपी निष्पादित करें, और इसे हटा दें।

मैं स्वयं एक एमएसएसएलएल व्यक्ति हूं और मैं कभी इसकी सिफारिश नहीं करता - लेकिन यह उस तरह का पागल हैक है जिसे मुझे पास में उपयोग करना पड़ा था जब मैं एमएसएसक्यूएल के थोक अपलोड कार्यक्षमता के अपने ब्रांड पर भरोसा नहीं कर सका।

वैकल्पिक रूप से आप SQL में एकाधिक सम्मिलन विवरण बना सकते हैं और इसे डीबी को एक ही कमांड के रूप में भेज सकते हैं? दोबारा क्षमा करें एक mysql विशेषज्ञ नहीं, लेकिन यह अन्य डेटाबेस में बहुत संभव है।

+0

मेरे पास सर्वर पर इतने सारे एक्सेस विशेषाधिकार नहीं हैं। मेरा डीबी खाता केवल मूल्यों को सम्मिलित कर सकता है और उससे भी कुछ भी नहीं। और यह mySQL डीबी पर एक बाधा है। मैं सीएसवी या किसी अन्य चीज का उपयोग नहीं कर सकता। –

+0

क्या MySQL एक SQL निर्देश स्वीकार कर सकता है जो किसी भी तरह से कई प्रविष्टियों को सम्मिलित करता है - यानी एक एसपी के रूप में नहीं। इस मामले में बैचों में आवेषण को विभाजित करें। –

0

यदि आप माईएसQL लेनदेन का उपयोग कर सकते हैं और बैच में क्वेरी बंद कर सकते हैं, तो कहें, एक बार में कई सौ, यह सम्मिलन की विश्वसनीयता और गति में सुधार कर सकता है।

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

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