2010-04-26 6 views
6

शायद यह थोड़ा गूंगा है, लेकिन मुझे यकीन नहीं है कि बेहतर क्या है। अगर मुझे एक्सबीस्तान के लिए डीबी में 10k से अधिक पंक्तियों की जांच करनी है, तो मैं क्या करूँगा?क्या बेहतर है- लंबे समय से 'कहां' स्थिति या कई छोटे प्रश्न पूछें?

# 1 - एक क्वेरी

select id from table1 where name in (smth1,smth2...{till 30k}) 

# 2 - कई प्रश्न

select id from table1 where name=smth1 

हालांकि, कार्यक्षमता लक्ष्य नहीं है, मैं mysql किसी के साथ नीचे जाने के लिए नहीं करना चाहते हैं;) शायद, कोई अन्य समाधान अधिक उपयुक्त होगा ... धन्यवाद।

अपडेट: कार्य डोमेन सूची लाने, नए सहेजने के लिए है (जो अभी तक डीबी में नहीं हैं) और सूची से असंतुष्ट लोगों को हटा दें। उम्मीद है, यह थोड़ा सा मदद करेगा ...

+1

क्या आप सुनिश्चित हैं कि आप इसे किसी अन्य तरीके से नहीं कर सकते हैं? –

+0

@ लोरीस: मुझे लगता है कि उनका मतलब था कि वह ऐसा कर सकता था जब वह लिखा था "शायद, कोई अन्य समाधान अधिक उपयुक्त होगा" –

उत्तर

4

आपको क्या करना चाहिए एक टेम्पलेट टेबल बनाएं, सभी नाम डालें, और (एक प्रश्न का उपयोग करके) इस चयन के लिए इस तालिका के विरुद्ध शामिल हों।

select id 
from table1 t1 
inner join temptable tt on t1.name = tt.name 
+0

आपका मतलब है, पहले करें - अस्थायी तालिका को आकर्षक (नाम वर्कर (255) बनाएं) ; फिर इसमें कई पंक्तियां डालें और अपने उदाहरण में शामिल हों? – DCrystal

+1

@DCrystal: हाँ, बिल्कुल। नामों की सूची कहां से आ रही है? – RedFilter

+0

मैंने प्रश्न अपडेट किया है, शायद यह इसे स्पष्ट करेगा ... – DCrystal

3

एकल क्वेरी अधिकतर बेहतर प्रदर्शन करेगी क्योंकि दूसरा राउंड-ट्रिप देरी देगा। लेकिन अगर आपके पास आपके उदाहरण में बहुत सारे नाम हैं तो पहली विधि आपको आंतरिक सीमा को मारने का कारण बन सकती है।

इस मामले में अस्थायी तालिका में नामों की सूची को स्टोर करना और इसके साथ जुड़ना बेहतर हो सकता है।

1

इसी तरह की चीजों को करने के लिए आपकी भविष्य की ज़रूरतों के आधार पर, आप डेटाबेस 'strlist_to_table' में एक फ़ंक्शन जोड़ना चाहेंगे। फ़ंक्शन को एक टेक्स्ट लेना चाहिए जहां आपका इनपुट एक डिलीमीटर चरित्र (संभवतः फ़ंक्शन पर भी पास किया गया) द्वारा सीमित है, इसे ऑन-द-फ्लाई टेबल बनाने के लिए इसे डिलीमीटर पर विभाजित करें। तो फिर तुम

where in strlist_to_table('smth1|smth2', '|') 

का उपयोग करें और यह भी एसक्यूएल इंजेक्शन से सुरक्षा प्राप्त कर सकते हैं (शायद थोड़ा बॉबी टेबल्स इनपुट में प्रकट होता है)।

बस मेरे 2 सेंट ...

0

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

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