MySQL डेटाबेस (या सामान्य रूप से किसी भी डेटाबेस) में एक बड़े डेटासेट को सम्मिलित करने का सबसे अच्छा तरीका क्या है


9

एक PHP परियोजना के हिस्से के रूप में, मुझे एक MySQL डेटाबेस में एक पंक्ति सम्मिलित करनी होगी। मुझे स्पष्ट रूप से ऐसा करने की आदत है, लेकिन एक प्रश्न में 90 कॉलम में डालने की आवश्यकता है। परिणामी क्वेरी भयानक और अखंड लगती है (विशेषकर मूल्यों के रूप में मेरे PHP चर को सम्मिलित करते हुए):

INSERT INTO mytable (column1, colum2, ..., column90) 
VALUES
('value1', 'value2', ..., 'value90')

और मुझे चिंता है कि मैं इस बारे में सही तरीके से नहीं जा रहा हूं। मुझे भी सब कुछ टाइप करने में एक लंबा (उबाऊ) समय लगा और परीक्षण कोड लिखने में परीक्षण उतना ही थकाऊ होगा जितना मुझे डर है।

इन प्रश्नों को लिखने और परीक्षण करने के लिए पेशेवर कैसे जाते हैं? क्या कोई तरीका है जिससे मैं इस प्रक्रिया को तेज कर सकता हूं?


2
मुझे अधिक चिंता है कि तालिका में कॉलम नामों में टाइप किए गए समय की तुच्छ मात्रा से 90 कॉलम हैं। (BTW मैं सभी कॉलमों को एक साथ SQL Server में खींचता और छोड़ता हूँ, क्या mySQL या PHP में ऐसा करने के लिए aplace नहीं है? मैं देखूंगा कि क्या आप पा सकते हैं कि यह जीवन को आसान बनाता है क्योंकि कोई टाइपोस नहीं है।)
HLGEM

1
मुझे पता है कि 90 कॉलम बहुत हैं, लेकिन प्रत्येक कॉलम एक पीडीएफ दस्तावेज़ के लिए एक ही क्षेत्र से संबंधित है जिसे मुझे आबाद करने की आवश्यकता है और मुझे इसे तोड़ने में बिंदु नहीं दिखता है, या मैं ऐसा कैसे करूंगा। SQL सर्वर के बारे में जानकारी के लिए धन्यवाद। मुझे यकीन नहीं है कि आप कॉलम को खींचने और छोड़ने के बारे में क्या मतलब है, मैं एक नज़र रखूँगा।
जो

1
एक चयनित कथन लिखें जो किसी दिए गए तालिका के सभी कॉलमों को सूचीबद्ध करता है और वहां से जाता है।
जेएफओ

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

जवाबों:


7

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


आपके जवाब के लिए धन्यवाद। सभी क्षेत्र (सूचकांक के अलावा) VARCHARS हैं, इसलिए यह मेरे लिए काम करेगा (और मैं वैसे भी अन्य मूल्यों को परिवर्तित कर सकता हूं)। मैं बहुत सी जगह बर्बाद कर रहा हूँ, क्योंकि मेरे पास सबसे बड़े मूल्य के लिए फ़ील्ड_वल्यू कॉलम का आकार होना चाहिए (लगभग 256 वर्ण लंबा) जबकि कुछ क्षेत्रों में केवल 3 की लंबाई की आवश्यकता होती है। यह निश्चित रूप से उपयोग करना आसान होगा और मैं समझ सकता हूं कि यह भविष्य का प्रमाण कैसे होगा जैसा कि आपने वर्णित किया है।
जो

4
FWIW, अधिकांश डेटाबेस सिस्टम डेटा को स्टोर करने के लिए केवल उतने ही स्थान का उपयोग करते हैं। इसलिए यदि आप एक VARCHAR (256) फ़ील्ड में केवल 3 वर्ण संग्रहीत करते हैं, तो यह केवल 3 बाइट्स लेगा, न कि 256। मुझे MySQL इंटर्नल के बारे में ज्यादा जानकारी नहीं है, लेकिन मुझे आश्चर्य होगा कि अगर वे अपने खेतों को पूरी तरह से गद्देदार करते हैं घोषित आकार।
TMN

@TMN यही VARCHAR में VAR का मतलब है! चर लंबाई चार। यह डीबी सिस्टम नहीं डेटा प्रकार का एक फ़ंक्शन (या परिभाषा) है। यह भी नहीं है कि एक VARCHAR चर लंबाई है, इसलिए DB को प्रत्येक मान के लिए लंबाई जानने की जरूरत है, इसलिए यह मेटाडेटा के रूप में लंबाई संग्रहीत करता है। इसका मतलब है कि ओवरहेड स्टोरेज! तो एक VARCHAR (1) वास्तव में ओवरहेड के कारण 3 बाइट्स डेटा का उपयोग करता है, 3x एक चार (1) जितना होता है!
मोरोंस

2
-1, मैं इस जवाब से असहमत हूं, इस मामले में आप 90 कॉलम से बेहतर हैं। यदि इकाई में 90 डेटा बिंदु हैं, तो ऐसा हो, तो अपना डेटा तर्कसंगत रखें।
मोरोंस

@TMN ने सिर्फ मेरी बात को स्पष्ट करने के लिए कहा, "इसलिए यदि आप एक VARCHAR (256) फ़ील्ड में केवल 3 वर्णों को संग्रहीत करते हैं, तो यह केवल 3 बाइट्स लेगा" सच्चाई यह है कि 5 बाइट्स होंगे 3. नहीं
मोरोंस

7

सामान्य तौर पर, एक बड़े डेटासेट को SQL डेटाबेस में लोड करने का सबसे तेज़ तरीका देशी बल्क लोडिंग इंटरफ़ेस का उपयोग करना है। जहाँ तक मुझे पता है, हर SQL dbms में कम से कम एक है।

MySQL डॉक्स: बल्क लोडर का उपयोग करना

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


2
बल्क लोडिंग वास्तव में जाने का तरीका है यदि आपको बड़ी संख्या में पंक्तियों को सम्मिलित करने की आवश्यकता है, लेकिन इस मामले में वह बहुत सारे स्तंभों के साथ एक ही पंक्ति सम्मिलित कर रहा है। बल्क लोड करने से मदद नहीं मिलेगी, और संभवतः सीधे दृष्टिकोण की तुलना में अधिक कोड लिखने की आवश्यकता होगी।
टीएमएन

-1, यह उत्तर पूरी तरह से प्रश्न के बिंदु से गायब है
डॉक्टर ब्राउन

2

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


2

यदि आपके पास एक csv फ़ाइल है, तो आप डेटा आयात करने के लिए LOAD DATA INFILE ... का उपयोग कर सकते हैं ।

यदि आपको 'INSERT' प्रश्नों का उपयोग करना है, तो थोक आवेषण करने से प्रक्रिया में तेजी आएगी। हर एक पंक्ति के लिए 'INSERT' क्वेरी चलाने के बजाय, पंक्तियों को समूहित करें, 100 बोलें और क्वेरी चलाएँ। कुछ इस तरह:

INSERT INTO theTable (col1, col2, col3,....., col89, col90) 
VALUES
(val11, val12, val13, ........, val189, val190),
(val21, val22, val23, ........, val289, val290),
.......
......
(val101, val102, val103, ........, va1089, val1090);

2

MySQL DB में एक बहु-स्तंभ क्वेरी डेटा लिखने का एक प्रभावी तरीका इन डेटा को JSON या YAML प्रारूप में परिवर्तित करना और उन्हें एक एकल इकाई के रूप में सम्मिलित करना है। यह "90 कॉलम के साथ एक तालिका के लिए एक इंसर्ट लिखें" में "एक कॉलम के साथ एक टेबल में एक इंसर्ट लिखें" बदलता है।

इस दृष्टिकोण में, सभी चीजों को आधार घटकों में विभाजित करने की आवश्यकता नहीं है, और एकल डेटम केवल 1 कॉलम में संग्रहीत है।


@gnat: यह एक वैकल्पिक समाधान प्रदान करता है। यह "90 कॉलम के साथ एक तालिका के लिए एक इंसर्ट लिखें" में "एक कॉलम के साथ एक टेबल में एक इंसर्ट लिखें" बदलता है। वर्णित समस्या को देखते हुए, यह एक वैध समाधान है। नहीं सब कुछ टूटने की जरूरत है यह आधार घटकों में है। एकमात्र अन्य समान उत्तर, सुझाव दिया गया कि फुल NoSQL, SQL डेटाबेस को पूरी तरह से समाप्त कर दे, जो ओवरकिल है। यह उत्तर कहता है कि आप मिश्रित दृष्टिकोण का उपयोग कर सकते हैं। इस एकल डेटम के लिए सिर्फ 1 कॉलम बनाएं। विचार करें कि वैकल्पिक बाइनरी कॉलम हो सकता है और पूरे पीडीएफ को स्टोर कर सकता है।
15

@gnat: मैं नोविफ को इसे अपने शब्दों में रखने का मौका दूँगा ...
jmoreno

@ gnat और jmoreno - आपकी टिप्पणियों के लिए धन्यवाद। मुझे अपने उत्तर का स्पष्टीकरण स्पष्ट है, और मैंने उनके स्पष्टीकरण के आधार पर उत्तर को संपादित किया।
नोविफ

0

MySQL के साथ आप insertबयानों के लिए वैकल्पिक वाक्यविन्यास का उपयोग कर सकते हैं :

insert into table
        set column1 = value1
          , column2 = value2
          , column3 = value3

1
क्या यह वास्तव में तेज है?
पचेरियर

@ स्पेसर नहीं, यह तेज नहीं है। बस एक और वाक्यविन्यास।
Kaspars Foigts

0

NoSQL समाधान के लिए आपका परिदृश्य बहुत अच्छा लगता है, क्योंकि विशेषता सूची कभी भी स्वरूप बदल सकती है। क्या आपने MySQL के अलावा अन्य विकल्पों का मूल्यांकन किया है? DynamoDB / MongoDB / Cassandra के आसपास खोदो - कि एक बेहतर फिट हो सकता है।


-1

डेटाबेस में php और mysql का उपयोग करके डेटा डालने का अधिक कुशल तरीका है। डेटा डालने के लिए हम LOAD COMMAND का उपयोग कर सकते हैं। यह उल्लेखनीय रूप से तेजी से डेटा सम्मिलित करता है।

इसके लिए एक फ्लैट फाइल बनाएं (उदाहरण के लिए मैंने .csv फ़ाइल का उपयोग किया था) अपने डेटा के साथ fputcsv()फ़ंक्शन का उपयोग कर रहा हूं । फिर LOAD कमांड का उपयोग करके डेटा डालें। सिंटैक्स कुछ ऐसा है जो नीचे दिया गया है:

LOAD DATA LOCAL INFILE "C:/downloads/local/my_data_file.csv"
INTO TABLE  my_data
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

-1

निम्नलिखित प्रयास करें। मेरे लिए काम किया।

फॉर्म नाम डेटाबेस कॉलम नामों के बराबर होना चाहिए

नीचे दिए गए मान प्राप्त करें:

foreach ($_GET as $formName => $value) {
    $sql = mysql_query("UPDATE table_name SET $formName = '$value' WHERE ID= $id");
}

आपको पहले फ़ॉरेस्ट लूप से पहले एक आईडी डालना होगा। आप ऐसा करके अगली आईडी प्राप्त कर सकते हैं:

SELECT MAX(id) FROM .....

आईडी में 1 जोड़ें और इसे डालें।

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