2009-10-08 17 views
23

मैं दो चरणों में एक MYSQL क्वेरी चला रहा हूं। सबसे पहले, मुझे एक प्रश्न के साथ आईडी की एक सूची मिलती है, और फिर मैं SELECT * FROM data WHERE id in (id1, id2 ...) की पंक्तियों के साथ दूसरी क्वेरी का उपयोग करके उन आईडी के लिए डेटा पुनर्प्राप्त करता हूं। मुझे पता है कि यह हैकी लगता है, लेकिन मैंने इसे इस तरह से किया है क्योंकि प्रश्न बहुत जटिल हैं; पहले में बहुत सारी ज्यामिति और ट्रिगरगोनोमेट्री शामिल है, दूसरा अलग-अलग जुड़ता है। मुझे यकीन है कि उन्हें एक ही प्रश्न में लिखा जा सकता है, लेकिन मेरा MYSQL इसे खींचने के लिए पर्याप्त नहीं है।MYSQL "IN" का प्रदर्शन

यह दृष्टिकोण काम करता है, लेकिन यह महसूस नहीं करता है; प्लस मुझे चिंता है कि यह स्केल नहीं करेगा। फिलहाल मैं "आईएन" खंड में 400 आईडी के साथ 10,000 रिकॉर्ड के डेटाबेस पर परीक्षण कर रहा हूं (यानी IN (id1, id2 ... id400)) और प्रदर्शन ठीक है। लेकिन अगर 1,000,000 रिकॉर्ड कहें तो क्या होगा?

इस तरह की क्वेरी के लिए प्रदर्शन बाधाओं (गति, स्मृति, आदि) कहां हैं? इस तरह की क्वेरी को फिर से भरोसा करने के लिए किसी भी विचार के लिए भी भयानक होना चाहिए। (उदाहरण के लिए, यदि संग्रहित प्रक्रियाओं पर स्विटिंग करना उचित है)।

+0

आप अपनी क्वेरी के बारे में अधिक जानकारी क्यों नहीं देते? – RichardOD

+2

मुझे लगता है कि मैं किसी विशेष प्रश्न के बारे में नहीं पूछ रहा हूं; बल्कि अगर यह एक विशाल पैरामीटर सूची – Roy

उत्तर

19

रिकॉर्ड्स की एक निश्चित संख्या से शुरू, INSELECT पर अनुमानित स्थिरांक की सूची में उससे अधिक तेज़ हो जाता है।

तो IN खंड में क्वेरी में उपयोग स्तंभ अनुक्रमणित है, इस तरह::

SELECT * 
FROM table1 
WHERE unindexed_column IN 
     (
     SELECT indexed_column 
     FROM table2 
     ) 

प्रदर्शन की तुलना के लिए अपने ब्लॉग में यह लेख देखें

, तो यह क्वेरी सिर्फ EXISTS पर अनुकूलित है (जो उपयोग करता है लेकिन प्रत्येक रिकॉर्ड के लिए एक प्रविष्टि 0 से)

दुर्भाग्य से, MySQLHASH SEMI JOIN या MERGE SEMI JOIN जो अभी तक अधिक (कुशल खासकर अगर दोनों स्तंभ अनुक्रमित जाता है) करने में सक्षम नहीं है।

+0

के साथ "IN" का उपयोग करने के सिद्धांत में एक अच्छा विचार है, तो यह ब्लॉग आलेख वास्तव में उपयोगी है, धन्यवाद। – Roy

+0

इसने वास्तव में मुझे भी मदद की है। अच्छा लेख –

1

आप पहले आईडी को क्यों निकालते हैं? आपको शायद टेबल में शामिल होना चाहिए। यदि आप किसी अन्य चीज़ के लिए आईडी का उपयोग करते हैं, तो आप उन्हें पहले एक अस्थायी तालिका में डाल सकते हैं और शामिल होने के लिए इस तालिका का उपयोग कर सकते हैं।

+0

हाँ, आप शायद सही हैं। मैं पहले निकालने का प्रयास करता हूं क्योंकि निकालने की क्वेरी वास्तव में जटिल होती है (बहुत सारे और गणित, कुछ सबक्विरी इत्यादि) और मेरा छोटा मस्तिष्क एक ही समय में शामिल होने का तरीका नहीं कर सकता .. वास्तव में सोच रहा है कि मुझे होना चाहिए मेरे टू-डू सूची के शीर्ष के पास उस रिफैक्टर को डालना या नहीं! – Roy

+0

तो आपको शायद उन्हें एक अस्थायी तालिका में रखना चाहिए। यह उन्हें प्राप्त करने और खंड में निर्माण करने से आसान होगा। और क्वास्नोई का कहना है कि यह तेज़ होगा। –

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