2012-03-09 13 views
5

मेरे पास तेजी से बढ़ रहा है, लिखने वाला भारी PHP/MySQL एप्लिकेशन है जो कई पंक्तियों में एक दर्जन या उससे अधिक की दर से नई पंक्तियों को कई लाख पंक्तियों की एक INNODB तालिका में डालता है।MySQL INSERT बनाम PHP file_put_contents

मैंने रीयलटाइम INSERT कथन का उपयोग करना शुरू कर दिया और फिर फ़ाइल में प्रविष्टियां लिखने के लिए PHP और file_put_contents पर स्थानांतरित किया और डेटाबेस में डेटा प्राप्त करने के लिए डेटा डेटा लोड किया। बेहतर दृष्टिकोण कौन सा है?

क्या कोई विकल्प मुझे विचार करना चाहिए? मैं टकराव को संभालने और भविष्य में लोड में वृद्धि के दो तरीकों की उम्मीद कैसे कर सकता हूं?

धन्यवाद!

+0

एक विकल्प द्वितीयक तालिका में लिखना है, फिर मुख्य तालिका में लिखने पर मुख्य तालिका में 'से चुनें' से चुनें ... यदि मुख्य तालिका में लिखना एक मुद्दा हो रहा है। –

उत्तर

3

डेटा डालने की बैच-विधि के रूप में LOAD DATA INFILE के बारे में सोचें। यह प्रत्येक कथन के लिए एक सम्मिलित क्वेरी को फायर करने के ऊपरी हिस्से को समाप्त करता है इसलिए यह बहुत तेज़ है। हालांकि, त्रुटियों को संभालने पर आप कुछ नियंत्रण खो देते हैं। एक फ़ाइल के बीच में एक पंक्ति बनाम एक पंक्ति में एक त्रुटि को संभालना बहुत आसान है।

+0

आप टेबल मानों (पंक्ति 1), (पंक्ति 2), ..., (rowN) में वाक्यविन्यास डालने का उपयोग कर सकते हैं; एक पंक्ति के साथ जितनी चाहें उतनी पंक्तियां डालने के लिए। अद्वितीय कुंजी टकरावों को संभालने के तरीके को निर्दिष्ट करने के लिए आप "... डुप्लिकेट कुंजी अपडेट ..." में भी संलग्न कर सकते हैं – atxdba

+0

@atxdba यह बड़े आवेषणों पर एक भयानक विचार है। – feketegy

+0

@feketegy भयानक कैसे? प्रदर्शन? http://tinyurl.com/7jmzbcp एसओ पोस्ट बिछा रहा है कि यह कैसे बेहतर और पसंदीदा है। अनुमोदित है कि आप एक ही डालने में डेटा के कई गीगा लोड नहीं करना चाहते हैं, लेकिन एक कंबल अपरिभाषित कथन बनाते हैं कि यह भयानक है कि यह गलत है। यहां तक ​​कि mysqldump डिफ़ॉल्ट रूप से बैच आवेषण बनाएगा। यदि आप डेटा लोड डेटा के वास्तव में बड़े सेट के लिए कह रहे हैं तो बेहतर हो सकता है, मैं इसका तर्क नहीं दूंगा। मैं वास्तव में उपलब्ध वाक्यविन्यास को इंगित कर रहा था। – atxdba

0

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

इसके अतिरिक्त आप यह देखने के लिए लिखने के दौरान इंडेक्स को अक्षम करना चाहते हैं कि यह प्रदर्शन में सुधार करता है या नहीं।

+0

इंडेक्स को अक्षम करने पर अच्छा नोट - धन्यवाद – user1259956

+0

विचार करने का एक और मुद्दा यह है कि आपकी विशेष प्रणाली के लिए बाधा है। यह निर्धारित करने के लिए Iostat और vmstat का उपयोग करने का प्रयास करें कि आपके मंदी कहां हैं और आपको अपने प्रयासों पर ध्यान केंद्रित करना चाहिए। आपके डेटा के साथ आप जो कर रहे हैं उसके आधार पर स्टोरेज के लिए कई समाधान हैं, उनमें से कुछ एसीआईडी ​​अनुकूल नहीं होने पर बहुत तेज हैं। – RumpRanger

0

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

लंबे समय तक (लिखने के 1k +) में, अन्य डेटाबेस देखें - विशेष रूप से भारी अनुप्रयोग लिखने के लिए कैसंद्रा।

+0

इंडेक्सिंग भी मेरे दिमाग में थी। जो प्रति लिखने वाला तेज़ होगा - एक फ्लैट फ़ाइल में शामिल होना या डेटाबेस में डालना? वे समवर्ती अनुरोधों को कैसे संभालेंगे? – user1259956

+0

यह वास्तव में निर्भर करता है, आपको परीक्षण चलाने और अपने पर्यावरण के लिए इसे समझने की आवश्यकता है। फ़ाइल में शामिल होना केवल परमाणु है यदि आप किसी सीमा के भीतर डेटा रखते हैं (मुझे लगता है कि लिनक्स पर इसका 4K), ओ/डब्ल्यू आपको समेकन के साथ समस्याएं होंगी – miki

-1

LOAD DATA सुरक्षा कारणों से कुछ सर्वर पर अक्षम है:

http://dev.mysql.com/doc/mysql-security-excerpt/5.0/en/load-data-local.html

इसके अलावा मैं अपने आवेदन पत्र उल्टा लिख ​​डेटाबेस अखंडता को बनाए रखने का आनंद नहीं है।

2

इस पर निर्भर करता है कि क्या आप PHP में डाले गए डेटा को तालिका में तुरंत उपलब्ध नहीं कर सकते हैं, तो INSERT DELAYED एक विकल्प हो सकता है।

MySQL डेटा को सम्मिलित करने के लिए स्वीकार करेगा और इसे बाद में सम्मिलन के साथ सौदा करेगा, इसे कतार में डाल देगा। तो यह आपके PHP अनुप्रयोग को अवरुद्ध नहीं करेगा जबकि MySQL बाद में डेटा को सम्मिलित करने के लिए सुनिश्चित करता है।

As it says in the manual:

विलंब डालने का उपयोग करने का एक अन्य प्रमुख लाभ यह है कि कई ग्राहकों से आवेषण एक साथ बंडल और एक ब्लॉक में लिखा जाता है। यह कई अलग-अलग आवेषण करने से बहुत तेज है।

मैं लॉगिंग डेटा के लिए इस का इस्तेमाल किया है, जहां एक डेटा हानि घातक नहीं है, लेकिन आप सर्वर दुर्घटनाओं से रक्षा की जानी करने के लिए जब INSERT DELAYED से डेटा अभी तक नहीं डाला गया था चाहते हैं तो आपको परिवर्तन करने के लिए दूर नकल पर गौर कर सकता है एक समर्पित गुलाम मशीन।

0

यदि आप एसक्यूएल सम्मिलित मार्ग पर जाते हैं, तो लेनदेन में पीडीओ निष्पादन विवरणों को लपेटें। ऐसा करने से प्रक्रिया बहुत तेज हो जाएगी।

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