2012-06-10 22 views
5

डालें तो मैं अपने डेटाबेस में 250 000 पंक्तियां डालने की कोशिश कर रहा हूं। चूंकि यह सिर्फ नमूना डेटा है, मुझे बस एक एक्स, वाई वैरिएबल से पूछने की ज़रूरत है जो इस प्रकार लूप के लिए बदलती है और केवल उस इलाके में जो 'पानी'जल्दी से 250k पंक्तियां

है लेकिन यह हमेशा के लिए ले रहा है। किसी को पता है कि मैं इसे तेजी से कैसे कर सकता हूं?

ini_set('max_execution_time', 70000); 

$conn = mysql_connect('localhost', 'root', '') or die(mysql_error()); 
mysql_select_db('hol', $conn) or die(mysql_error()); 

for ($y=0;$y<500;$y++) { 
    for ($x=0;$x<500;$x++) { 
     mysql_query("INSERT INTO map(x, y, terrain) VALUES($x, $y, 'water')"); 
    } 
} 
+2

"जल्दी" और "25000" हाथ में अच्छी तरह से नहीं जाते हैं, खासकर 250k व्यक्तिगत प्रश्नों के साथ नहीं! @ Yes123 की सलाह लें और 1 क्वेरी का उपयोग करके अपने सभी मूल्यों को सम्मिलित करें, या कम से कम कम करें यदि स्ट्रिंग बहुत लंबी हो। – Bojangles

+0

मुझे यह महसूस क्यों हो रहा है कि, आपको वास्तव में क्या चाहिए, किसी अन्य डेटाबेस से डेटा आयात करने के लिए? –

+0

आप बस गलत हैं, मुझे डर है। यह ऊपर दिए गए कुछ नमूना डेटा डालने के बारे में है। – josmith

उत्तर

8

आप इन्फाइल स्टेटमेंट से MySQL लोड डेटा का उपयोग करके बेहतर कर सकते हैं। बड़े पैमाने पर सम्मिलन कथन तारों के निर्माण से बैच लोडिंग तेज हो जाती है। फ़ाइल में अपना डेटा लिखें और एक ही लोड करें।

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

सम्मिलित करें/लोड भी मेज पर अनुक्रमित की संख्या पर निर्भर करता है। केवल आवश्यक कॉलम पर इंडेक्स बनाएं। तालिका में डेटा लोड होने के बाद आप इंडेक्स को जोड़कर अक्सर बेहतर प्रदर्शन प्राप्त करेंगे ताकि आप डेटा जोड़ने के दौरान इंडेक्स अपडेट नहीं कर रहे हों।

+0

दिलचस्प। सवाल यह है कि मैं एक ही लोड को शुरू करने से पहले फ़ाइल में सभी डेटा लिखने में कितना समय लगेगा – josmith

+1

@ जोस्मिथ डिस्क की गति IO गतिविधि पर निर्भर करता है, डिस्क की गति, यदि आप फ़ाइल को रैमडिस्क में लिखते हैं , आदि – damianb

+0

सहमत हुए। मुझे बड़ी एकल फाइलों, विशेष रूप से पाठ फ़ाइलों, वास्तव में एक समस्या है। मुझे पूरा यकीन नहीं है कि क्यों। – josmith

3
INSERT INTO map (x, y, terrain) 
VALUES ($x, $y, 'water'), ($x, $y, 'water') [etc] 

तो आपको केवल 1 क्वेरी की आवश्यकता होगी। जब आप 400-500 मूल्यों

+0

हाँ लेकिन 250k पंक्तियों के लिए स्ट्रिंग लंबाई लंबे समय तक होगी। –

+0

@ डैगन: जब यह 500 मान – dynamic

+0

संपादन के साथ अच्छी तरह से क्वेरी लॉन्च करता है, तो मैं सहमत हूं :-) –

2

आपको यह सुनिश्चित करना है कि आप उन 250.000 में नहीं चल रहे हैं बनाना चाहिए जोड़ लिया है

बेशक

कई क्वेरी में क्वेरी विभाजित स्वतः-मोड (250.000 लेनदेन)।

उन सभी को एक लेनदेन में भेजकर, आप चीजों को थोड़ा सा गति देंगे क्योंकि mysql इंजन को 250,000 बार अपने लेनदेन तंत्र का आह्वान नहीं करना पड़ेगा।

सीएफ PHP + MySQL transactions examples

mysql_query("START TRANSACTION"); 
... your requests 
mysql_query("COMMIT"); 

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

+0

तो mysql_query ("BEGIN"); क्या यह एक बड़े लेनदेन में करेगा? – josmith

+0

"स्टार्ट ट्रांसलेशन" का प्रयोग करें जो अधिक मानक है। कृपया मुझे गति में अंतर के साथ अद्यतन रखें। यदि आप माइस्क्ल इनो डीबी जैसे लेनदेन इंजन का उपयोग कर रहे हैं तो इससे कोई फर्क पड़ता है। –

+1

mysql में आंतरिक रूप से लेन-देन कैसे संभाले जाते हैं? लेनदेन किए जाने तक सभी 250,000 पंक्तियों को याद में रखा जाएगा? –

0

जाहिर है क्योंकि पहले कथन के लिए केवल 500 मान हैं, यह बहुत महत्वपूर्ण नहीं है कि आप मूल्य कैसे डालते हैं, आप इसे लूप का उपयोग करके कर सकते हैं।

INSERT INTO temp500 (value) 
    VALUES (0), (1), (2), ... (499); 
INSERT INTO map (x, y, terrain) 
    SELECT x.value, y.value, 'water' 
    FROM temp500 x, temp500 y; 
संबंधित मुद्दे