2009-12-24 10 views
9

मुझे पता है कि आम तौर पर आपके द्वारा आवश्यक प्रत्येक आइटम को नाम देने के लिए mysql प्रश्नों का निर्माण करने के लिए हमेशा बेहतर प्रदर्शन होता है लेकिन उदाहरण के लिए प्रोफाइल पेज पर मुझे कुछ आइटम को छोड़कर कुछ आइटम की आवश्यकता हो सकती है।का उपयोग करने के लिए सबसे अच्छा * mysql में बहुत से फ़ील्ड को कॉल करते समय?

SELECT user_name,f_name,l_name,country,usa_state,other_state,zip_code,city,gender,birth_date,date_created,date_last_visit, 
user_role,photo_url,user_status,friend_count,comment_count,forum_post_count,referral_count,referral_count_total, 
setting_public_profile,setting_online,profile_purpose,profile_height,profile_body_type,profile_ethnicity, profile_occupation,profile_marital_status,profile_sex_orientation,profile_home_town,profile_religion, 
profile_smoker,profile_drinker,profile_kids,profile_education,profile_income,profile_headline,profile_about_me, 
profile_like_to_meet,profile_interest,profile_music,profile_television,profile_books,profile_heroes,profile_here_for,profile_counter FROM users WHERE user_id=1 AND user_role > 

तो परीक्षण का एक गुच्छा किए बिना, शायद अधिक अनुभव वाला कोई व्यक्ति कुछ सलाह के साथ झुका सकता है?

इस बदतर

SELECT * FROM users WHERE user_id=1 AND user_role > 

मैं सभी आइटम सूची क्योंकि तब उस पृष्ठ पर यह सिर्फ अगर मैं डीबी से कुछ चाहिए कि मैं क्या मेरे पास उपलब्ध है देखने के लिए easiar है पसंद करते हैं नहीं होगा लेकिन अगर यह होगा तेजी से तो मैं सूची नहीं उन्हें

उत्तर

14

नोट: सभी क्षेत्रों नामकरण निश्चित रूप से सबसे अच्छा अभ्यास है, लेकिन इस पोस्ट में मैं केवल प्रदर्शन लाभ पर चर्चा करेंगे, डिजाइन और रख-रखाव वाले नहीं।


* वाक्य रचना निम्नलिखित कारणों के लिए धीमी हो सकते हैं:

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

  • रिटर्निंग अनुगामी क्षेत्रों: 20th क्षेत्र वापस जाने के लिए, पिछले 19 जांच की जानी चाहिए और ऑफसेट गणना की।

  • बस अधिक डेटा लौटने की आवश्यकता है (कनेक्शन पर पारित)।

चूंकि आपको लगभग सभी क्षेत्रों की आवश्यकता है, इसलिए अंतिम कारण शायद सबसे महत्वपूर्ण है। कहें, description TEXT फ़ील्ड केवल 150 फ़ील्ड का उपयोग पृष्ठ पर नहीं किया जा सकता है, लेकिन 10 बार अन्य सभी क्षेत्रों के साथ जितना अधिक स्थान पर कब्जा कर सकता है।

इस मामले में यह सभी क्षेत्रों का नाम देना बेहतर होगा और जिन क्षेत्रों की आपको आवश्यकता नहीं है उन्हें छोड़ दें।

+1

लेकिन यदि आपको ** सभी ** तालिका के फ़ील्ड की आवश्यकता है तो क्या होगा? –

+11

फिर आपको उन्हें बिल्कुल चुनना चाहिए। 'MySQL' आंतरिक रूप से फ़ील्ड की पूरी सूची में' * 'का विस्तार करेगा, इसमें कोई प्रदर्शन अंतर नहीं होगा। – Quassnoi

+0

@Quassnoi आपके पहले बिंदु के बारे में, मुझे समझ में नहीं आता कि हमारे मामले '*' में एक चुनिंदा अभिव्यक्ति कैसे इंडेक्स उपयोग को प्रभावित कर सकती है। जैसा कि मैं इसे समझता हूं, यदि 'WHERE' स्थिति अनुक्रमित विशेषता के साथ काम करती है तो संबंधित इंडेक्स का उपयोग स्थिति को संतुष्ट करने वाले रिकॉर्ड खोजने के लिए किया जाएगा। रिकॉर्ड्स स्थित होने के बाद आरडीबीएमएस चयनित अभिव्यक्ति द्वारा आवश्यक विशेषताओं को लोड करेगा। इस दृष्टिकोण से, सूचकांक उपयोग लोड किए गए विशेषताओं के सेट पर निर्भर नहीं होना चाहिए। –

2

आपको हमेशा आवश्यक कॉलम निर्दिष्ट करना चाहिए, जब तक कि आपकी प्रोग्रामिंग भाषा सहयोगी सूचियों/सरणी का समर्थन न करे, ताकि नाम नाम से पुनः प्राप्त किए जा सकें।

आप तो सूचकांक संख्या से यह नहीं निकाला जा, * का उपयोग कर बाद में एक बड़ी समस्या पैदा कर सकता है यदि आप तालिका में कहीं भी एक नया स्तंभ सम्मिलित, के रूप में उस बिंदु से सभी सूचकांकों एक के बाद में वृद्धि होगी की जरूरत है ...

3

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

यदि यह बहुत अधिक फ़ील्ड है, तो आप अपनी आवश्यकता से अधिक डेटा पुनर्प्राप्त कर सकते हैं और वापस कर सकते हैं।

आपको कुछ नए क्षेत्रों में समस्या हो सकती है। उदाहरण के लिए, यदि आप केवल फ़ील्ड के माध्यम से लूप करते हैं और उन्हें प्रदर्शित करते हैं, तो आपके पास ऐसे नए फ़ील्ड हो सकते हैं जिन्हें आप प्रदर्शित नहीं करना चाहते हैं। या डेटा प्रकार को पहले कुछ स्वरूपण की आवश्यकता हो सकती है।

एक मौका भी है कि तालिका से एक फ़ील्ड हटा दिया जाएगा, उदाहरण के लिए तालिका को सामान्यीकृत करने में। कोड जो किसी विशेष क्षेत्र की अपेक्षा करता है उस मामले में तोड़ सकता है।

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

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