मुझे एक बड़े डीबी को जल्दी से अपडेट करने की आवश्यकता है। एक स्क्रिप्टिंग भाषा में कोड करना आसान हो सकता है लेकिन मुझे संदेह है कि एक सी प्रोग्राम अपडेट को तेज़ी से करेगा। किसी को पता है कि तुलनात्मक गति परीक्षण किया गया है या नहीं?क्या MySQL डेटाबेस पहुंच गति मुख्य रूप से डीबी द्वारा सीमित है, या इसे एक्सेस करने के लिए उपयोग की जाने वाली भाषा द्वारा?
उत्तर
मैंने अनुमान लगाया है कि सी एपीआई तेज है, लेकिन मैंने कोई मानक नहीं देखा है। प्रोग्रामिंग भाषा के बावजूद, बड़े डेटाबेस संचालन को तुरंत करने के लिए, संग्रहित प्रक्रियाओं का उपयोग करें: http://dev.mysql.com/tech-resources/articles/mysql-storedprocedures.html।
गति इस तथ्य से आती है कि नेटवर्क पर कम तनाव है।
उस लिंक से:
संग्रहित प्रक्रियाओं में तेजी से कर रहे हैं! खैर, हम यह साबित नहीं कर सकते कि अभी तक MySQL के लिए, और सभी का अनुभव अलग-अलग होगा। हम कह सकते हैं कि MySQL सर्वर कैशिंग का कुछ लाभ लेता है, केवल तैयार कथन के रूप में। कोई संकलन तो एक SQL संग्रहित प्रक्रिया एक प्रक्रिया इस तरह के सी के रूप में एक बाहरी भाषा मुख्य गति लाभ नेटवर्क यातायात की कमी से आता है के साथ लिखा के रूप में के रूप में जल्दी से काम नहीं चलेगा, नहीं है। यदि आपके पास दोहराव वाला कार्य है जिसके लिए जांच, लूपिंग, एकाधिक कथन, और कोई उपयोगकर्ता इंटरैक्शन की आवश्यकता नहीं है, तो सर्वर पर संग्रहीत प्रक्रिया के लिए इसे एक कॉल पर कॉल करें। तो कार्य के प्रत्येक चरण के लिए संदेश और क्लाइंट के बीच संदेश आगे नहीं होंगे।
यह नहीं होगा। अद्यतन गति की दर पर निर्भर करता है:
- डेटाबेस विन्यास (इंजन, डाटाबेस config) सर्वर की
- हार्डवेयर, विशेष रूप से HDD सबसिस्टम स्रोत और लक्ष्य मशीन के बीच
- नेटवर्क बैंडविड्थ
मुझे संदेह है कि आपको लगता है कि इस अंतिम भाग में एक स्क्रिप्टिंग भाषा एक हॉग होगी - डेटा स्थानांतरित की गई राशि।
कोई भी स्क्रिप्टिंग भाषा डेटा वितरित करने के लिए पर्याप्त तेज़ी से होगी। यदि आपके पास बड़ी मात्रा में डेटा है जिसे आपको तुरंत पार्स/ट्रांसफॉर्म करने की आवश्यकता है - तो हाँ, सी निश्चित रूप से पसंद की भाषा होगी। हालांकि अगर यह डीबी को सरल स्ट्रिंग डेटा भेज रहा है, तो ऐसा करने में कोई बात नहीं है, हालांकि ऐसा नहीं है कि UPDATE
ऑपरेशन के लिए एक सरल सी प्रोग्राम बनाना मुश्किल है। ऐसा नहीं है कि यह सी में ऐसा करने के लिए जटिल है, यह लगभग "जटिलता" दृष्टिकोण से PHP के mysql_ फ़ंक्शंस का उपयोग करने के बराबर है।
यह मत भूलना कि जिस तरह से आप * लिखते हैं * एसक्यूएल प्रश्नों को स्वयं गति पर एक बड़ा प्रभाव डाल सकता है। – dqhendricks
बेशक, लेकिन मुझे लगता है कि यह दिया गया है, इसे इंगित करने के लिए धन्यवाद :) –
सी के निम्न स्तर की भाषा के बाद, इसमें पार्सिंग/टाइप-रूपांतरण ओवरहेड नहीं होगा जो स्क्रिप्टिंग भाषाएं होंगी। एक MySQL int सीधे सी int पर मैप कर सकता है, जबकि एक PHP int में इसके साथ जुड़े विभिन्न मेटाडेटा होते हैं जिन्हें पॉप्युलेट/अपडेट करने की आवश्यकता होती है।
दूसरी तरफ, यदि आपको इस बड़े अपडेट के हिस्से के रूप में कोई टेक्स्ट मैनिपुलेशन करने की आवश्यकता है, तो सी से किसी भी गति लाभ शायद खराब स्ट्रिंग मैनिपुलेशन समर्थन के कारण हेयरपुलिंग/डिबगिंग में खो जाएगा क्योंकि आप इसके साथ क्या कर सकते हैं पर्ल या PHP जैसे स्क्रिप्टिंग भाषा में तुच्छ आसानी।
एक MySQL int ** ** एक सी int को मानचित्र नहीं कर सकता है। एक MySQL int नल मान ले सकता है। मैं MySQL के सी एपीआई से परिचित नहीं हूं लेकिन अन्य डेटाबेस सी एपीआई जिनके साथ मैंने निपटाया है, वे नल मानों को संभालने के लिए या तो समय या मेमोरी ट्रेड ऑफ ले जाते हैं, हैंडलिंग आमतौर पर प्रोग्रामर के लिए बोझिल भी होती है। दूसरी ओर, अधिकांश स्क्रिप्टिंग भाषाओं में या तो एक अनसेट, अपरिभाषित, या शून्य मान मूल रूप से शामिल होता है, इससे डेटाबेस द्वारा उपयोग की जाने वाली नल मान अवधारणा को संभालना आसान हो जाता है। –
क्या आप गति के बारे में चिंतित हैं क्योंकि आप पहले से ही ऐसी स्थिति से निपट रहे हैं जहां गति एक समस्या है, या आप बस आगे की योजना बना रहे हैं?
मैं आराम से कह सकता हूं कि डीबी इंटरैक्शन आम तौर पर आईओ, नेटवर्क बैंडविड्थ, मेमोरी, डेटाबेस यातायात, एसक्यूएल जटिलता, डेटाबेस कॉन्फ़िगरेशन, इंडेक्सिंग मुद्दों, और एक स्क्रिप्टिंग की पसंद से कहीं अधिक चुने गए डेटा की मात्रा से बाधित होते हैं भाषा बनाम सी
जब आप बाधाओं में भाग लेते हैं, तो वे लगभग हमेशा बेहतर एल्गोरिदम, इंडेक्स के बेहतर उपयोग, तेज आईओ डिवाइस, अधिक कैशिंग द्वारा हल किए जाएंगे ... उन चीजों की चीजें (एल्गोरिदम से शुरू)।
एलएएमपी का चौथा घटक सभी के बाद एक पटकथा भाषा है। जब ठीक ट्यूनिंग होता है, तो memcache एक विकल्प बन जाता है, साथ ही साथ लगातार दुभाषिया (जैसे कि वेब वातावरण में mod_perl, उदाहरण के लिए)।
डेटाबेस लेनदेन में बहुमत लागत डेटाबेस पक्ष पर है। आपके SQL कथन को समझने/संकलित करने और क्वेरी निष्पादन का मूल्यांकन करने की लागत जो भेजा गया है, उस भाषा में पाया जाने वाला कोई भी अंतर उससे कहीं अधिक महत्वपूर्ण है।
यह दुर्लभ परिस्थितियों में है कि डेटाबेस-गहन कार्य के लिए एप्लिकेशन का सीपीयू उपयोग डेटाबेस सर्वर के CPU उपयोग, या उस सर्वर की डिस्क गति से अधिक कारक है।
जब तक आपके एप्लिकेशन लंबे समय से चल रहे हों और डेटाबेस पर प्रतीक्षा न करें, तो मैं उन्हें बेंचमार्क करने की चिंता नहीं करता। अगर उन्हें बेंचमार्किंग की ज़रूरत है, तो आपको इसे स्वयं करना चाहिए। डेटा उपयोग के मामले जंगली रूप से भिन्न होते हैं और आपको अपनी संख्या की आवश्यकता होती है।
सी एपीआई मामूली तेजी से होगा, किसी अन्य भाषा के बावजूद (चाहे वह "स्क्रिप्टिंग भाषा" या पूरी तरह से संकलित भाषा हो) चाहे वह कुछ स्तर पर उस भाषा से मैपिंग करे सी एपीआई। सी एपीआई का उपयोग सीधे मैपिंग ऑपरेशन करने और फिर सी एपीआई का उपयोग करने से कुछ दर्जन सीपीयू चक्र तेजी से होगा।
लेकिन यह सिर्फ सागर में थूक रहा है। यहां तक कि तक पहुंचने के लिए मुख्य मेमोरी आधुनिक मशीन पर सीपीयू चक्रों की तुलना में परिमाण या दो धीमी गति का क्रम है और आई/ओ ऑपरेशंस (डिस्क या नेटवर्क एक्सेस) अभी भी तीव्रता के कई आदेश हैं। वास्तव में क्वेरी चलाने के लिए क्वेरी को भेजने के लिए इसे माइक्रोसॉन्ड तेजी से बनाने के लिए ऑप्टिमाइज़ करने में कोई बात नहीं है, अगर यह क्वेरी को वास्तव में चलाने के लिए आधे सेकेंड (या यहां तक कि एकाधिक सेकंड, जटिल या जांच/बड़ी मात्रा में डेटा लौटाएगा) के लिए भी ले जाएगा।
उस भाषा का चयन करें जिसमें आप सबसे अधिक उत्पादक होंगे और माइक्रो-ऑप्टिमाइज़िंग भाषा पसंद के बारे में चिंता न करें। यहां तक कि यदि भाषा स्वयं प्रदर्शन प्रदर्शन बन जाती है (जो अत्यंत असंभव है), तो आपकी अतिरिक्त उत्पादकता अतिरिक्त सर्वर की लागत से अधिक धन बचाएगी।
मुझे पता चला है कि डेटा के बड़े बैचों (गीगाबाइट्स या अधिक) के लिए, यह आमतौर पर माइस्क्ल से डेटा को एक फ़ाइल या एक फ़ाइल मशीन पर एकाधिक फ़ाइलों में डंप करने के लिए समग्र रूप से तेज़ होता है। फिर वहां इसे संसाधित करें (अपने पसंदीदा टूल के साथ, यहां: पर्ल) और एसक्यूएल में जितना संभव हो उतना कम करने के दौरान लोड डेटा स्थानीय इन्फाइल का उपयोग इसे ताजा टेबल में वापस घुमाने के लिए करें।कर रही हैं, वहीं आप लोड से पहले मेज से
निकालें अनुक्रमित (नहीं MyISAM के लिए आवश्यक हो सकता है, लेकिन हुंह) चाहिए।
हमेशा, हमेशा पीके आदेश में डेटा लोड करते हैं!
लोडिंग के साथ होने के बाद इंडेक्स जोड़ें।
एक और लाभ यह है कि यह तेजी से लेकिन-वाष्पशील डिस्क की एक समूह के साथ एक सस्ते आवेदन मशीन पर प्रसंस्करण parallelize बजाय अपने महंगा और गैर स्केलेबल डेटाबेस स्वामी के पास समवर्ती लेखन करने के लिए बहुत आसान हो सकता है।
किसी भी तरह से। बड़े डेटासेट का आमतौर पर मतलब है कि डीबी बाधा है।
मैं स्पष्ट रूप से बैच प्रोसेसिंग का जिक्र कर रहा हूं। यदि आप OLTP- जैसे अनुप्रयोगों के बारे में सोच रहे हैं ... ऐसा मत करो। – tsee
बेशक यह तेज़ है, सवाल यह है: कितना? 1%? 0.5%? Amdahl के कानून देखें – ninjalj
नहीं, मुख्य रूप से सवाल यह है कि बड़े डेटाबेस को यथासंभव तेज़ी से कैसे पहुंचाया जाए। बेंचमार्क एक विचारधारा थे। –
मेरा मतलब ओपी प्रश्न नहीं था, लेकिन मुख्य प्रश्न आपको कुछ अनुकूलित करने से पहले करना चाहिए, यानी अमाहल के कानून के अनुसार, कार्यक्रम के उस हिस्से को अनुकूलित करने से हम अधिकतम गति क्या उम्मीद कर सकते हैं। – ninjalj