2011-03-05 11 views
5

मैं एक प्रमुख अमेरिकी विश्वविद्यालय के लिए वेबमास्टर हूं। हमारे पास हमारी वेबसाइट पर बहुत से अनुरोध हैं, जिन्हें मैंने पिछले 7 सालों से बनाया है और प्रभारी बना दिया है। मैं अपनी वेबसाइट में कभी-कभी जटिल सुविधाओं का निर्माण कर रहा हूं और यह संभव है कि हमारे बहु-प्रोसेसर माइक्रोसॉफ्ट एसक्यूएल सर्वर पर प्रोग्रामिंग बोझ जितना संभव हो सके - संग्रहित प्रक्रियाओं, विचारों आदि का उपयोग करके, आईआईएस वेब सर्वर से PHP, एएसपी, या पर्ल के साथ क्या नहीं किया जा सकता है। दोनों सर्वर बहुत शक्तिशाली और सक्षम मशीनें हैं। चूंकि मैं इसे अकेले बिना किसी और के दिमाग में करने के लिए अकेले कर रहा हूं, इसलिए मैं उत्सुक हूं कि मेरा दृष्टिकोण भविष्य में भी उच्च भार स्थितियों के लिए आदर्श है।बेहतर अभ्यास: एसक्यूएल या वेब सर्वर पर लोड रखना?

मेरा सवाल यह है: क्या यह नेस्टेड SELECT स्टेटमेंट्स, विचारों, संग्रहीत प्रक्रियाओं और कुल कार्यों का उपयोग कर SQL सर्वर पर लोड बोझ को अधिक रखने का बेहतर अभ्यास है, या क्या मुझे सर्वर का उपयोग करके कई सरल प्रश्नों और प्रसंस्करण को खींचना चाहिए PHP की तरह संकलित समय स्क्रिप्ट्स? Keepin 'पर रखें या बेहतर तरीके से आते हैं?

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

आपकी सलाह और इनपुट के लिए धन्यवाद।

उत्तर

9

आप प्रत्येक परत को अपने स्टैक में पर उस डोमेन में उपयोग करते हैं जो यह सर्वोत्तम फिट बैठता है।

आपके डेटाबेस सर्वर 1000 पंक्तियों को भेजने और PHP को फ़िल्टर करने के लिए कोई उपयोग नहीं है यदि WHERE-Clause या GROUP-Clause पर्याप्त होगा। दो पूर्णांक जोड़ने के लिए डेटाबेस को कॉल करना इष्टतम नहीं है (SELECT 5+9 ठीक काम करता है, लेकिन PHP स्वयं इसे कर सकता है, और आप राउंडट्रिप को सहेजते हैं)।

शायद आप स्केलेबिलिटी में देखना चाहते हैं: आपके एप्लिकेशन के कौन से हिस्से एकाधिक प्रक्रियाओं में विभाजित किए जा सकते हैं? यदि आप अभी भी 2 परतों का उपयोग कर रहे हैं (स्क्रिप्ट & डीबी), वहां स्केलिंग के लिए बहुत सी जगह है। लेकिन हमेशा पहले बाधा से शुरू होता है।

कुछ उदाहरण: सीडीएन पर होस्ट स्थैतिक सामग्री, अपने पृष्ठों के लिए कैशिंग का उपयोग करें, nginx और memcached के बारे में पढ़ें, nosql (mongoDB) का उपयोग करें, sharding पर विचार करें, प्रतिकृति पर विचार करें।

+0

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

4

मेरी राय यह है कि वेब सर्वरों को प्रसंस्करण करने के पक्ष में यह आमतौर पर (ज्यादातर) सर्वोत्तम होता है। दो बिंदु:

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

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

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

+0

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

+0

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

+0

@ डेविड वेनराउब: वास्तव में एकल जुड़ने के लिए नहीं (जब तक कि आपके डेटाबेस डिज़ाइन के साथ वास्तव में कुछ गलत न हो)। मेरा मतलब था कि जब आप सभी जगहों से डेटा खींच रहे हैं, तो एक बार में इसे पकड़ने के लिए एक एकात्मक वक्तव्य लिखने के आग्रह का विरोध करें। सर्वोत्तम प्रथाओं के उदाहरण के लिए, विभिन्न विकास ढांचे, उदाहरण के लिए, केकेपीएचपी, रेल पर रूबी इत्यादि देखें, और देखें कि वे दूरस्थ रूप से संबंधित डेटा लाने में कैसे संभालते हैं। –

0

सबसे पहले, आप यह जांचना चाहेंगे कि क्या कोई लोड है जिसे क्लाइंट साइड कैशिंग (.js, .css, स्थिर HTML और छवियों) द्वारा पूरी तरह से हटाया जा सकता है, और AJAX को करने जैसी तकनीकों का उपयोग करना स्क्रीन के आंशिक अपडेट - यह वेब और एसक्यूएल सर्वर दोनों पर लोड हटा देगा।

दूसरा, देखें कि एसक्यूएल लोड है जो वेब सर्वर कैशिंग द्वारा कम किया जा सकता है - उदा। स्थैतिक या कम ताज़ा डेटा - यदि आपके सिस्टम पर बहुत सारे 'सामग्री' पृष्ठ हैं, तो सामान्य सीएमएस कैशिंग तकनीकों पर एक नज़र डालें जो कई उपयोगकर्ताओं को पृष्ठ को पुनर्निर्माण किए बिना या डेटाबेस को मारने के बिना समान डेटा देखने की अनुमति देगी।

+0

धन्यवाद nonnb। मैंने वास्तव में पिछले साल से अधिक AJAX और JSON डेटाबेस कॉल करना शुरू कर दिया है, जिसमें दोनों मेरे सर्वरों पर गति और कम बोझ दोनों हैं, इसलिए यह बहुत अच्छी सलाह है। सर्वर-साइड प्रोसेसिंग से क्लाइंट-साइड प्रसंस्करण बहुत कम महंगा है। मैं अपने पुराने पूर्ण-पृष्ठ पर्ल कोड को जावास्क्रिप्ट, AJAX/JSON, और PHP कमांड में पुनः लिख रहा हूं जो वास्तव में उदास महसूस करते हैं।फिर भी, PHP से मेरे कुछ डेटाबेस कॉल जटिल एसक्यूएल प्रश्नों का अनुरोध कर रहे हैं, एक्स्टेक्स जो नेस्टेड प्रश्नों को चलाते हैं आदि। मुझे कैशिंग में दिलचस्पी है इसलिए मुझे निश्चित रूप से इसमें और देखना होगा। – Brak

0

मैं डीबी के बाहर जितना संभव हो उतना करना चाहता हूं, डीबी कॉल को महंगा/समय-गहन के रूप में देखना।

उदाहरण के लिए, फ़ील्ड name_given और name_family के साथ उपयोगकर्ता तालिका पर चयन करने पर, मैं क्वेरी को फ़ेसने के लिए पूर्ण नाम नामक कॉलम वापस करने के लिए क्वेरी कर सकता हूं। लेकिन उस तरह की चीज आसानी से आपके सर्वर-साइड स्क्रिप्टिंग भाषा (PHP, रूबी, आदि) पर एक मॉडल में की जा सकती है।

बेशक, ऐसे मामले हैं जब डीबी ऑपरेशन करने के लिए अधिक "प्राकृतिक" जगह है। लेकिन, आम तौर पर, मैं वेब सर्वर पर लोड डालने और अन्य उत्तरों में उल्लिखित कई तकनीकों के साथ ऑप्टिमाइज़ करने की दिशा में अधिक ध्यान देता हूं।

+0

हे, मैंने बिल्कुल ठीक किया है कि मेरे सर्वर पर कई मामलों में, लेकिन केवल ऐसा करने के लिए एक एसक्यूएल कारण है, जैसे कि मुझे कुछ समेकित चीज़ों को सॉर्ट या समूह करना है। मेरी तरह की चीजों में से एक है 'user_name_first, user_name_last, user_alias, COALESCE (user_alias, user_name_first) AS userNameFirst'। इस तरह से मुझे एक रिकॉर्ड वापस मिलता है जिसमें पहले से ही उपयोगकर्ता का पसंदीदा नाम है। – Brak

+0

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

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