2012-06-22 8 views
5

मैं बस सोच रहा हूं कि सूची में आईडी की मात्रा क्वेरी प्रदर्शन को प्रभावित करेगी या नहीं।एसक्यूएल नहीं [आईड्स की सूची] (प्रदर्शन)

क्वेरी उदाहरण:

SELECT * FROM foos WHERE foos.ID NOT IN (2, 4, 5, 6, 7) 

कहाँ (2, 4, 5, 6, 7) एक असीम बढ़ती सूची है।

और कितने लोग हैं (आदेश के संदर्भ में)?

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

+14

क्या आपको यह डीबी 2 भी टैग नहीं करना चाहिए? और पृथ्वी पर क्या "असीम रूप से ग्रोइंग" है? क्या मुझे डरना चाहिए या उत्साहित होना चाहिए? –

+0

@AaronBertrand मुझे पता है, माफ करना, लेकिन यह शीर्षक पर विचार कर रहा था कि माईस्कल कहता है लेकिन फिर प्रत्येक आरडीबीएमएस टैग जोड़ा गया था। – Taryn

+1

आपका प्रश्न थोड़ा सा पूछने जैसा है "किस गति से खतरनाक खतरनाक हो रहा है?" इस मामले में, आप जो पूछ रहे हैं उसे पाने के कई तरीके हैं लेकिन यदि आप अपने अनुरोध के लिए * वास्तविक * कारण प्रदान करेंगे तो हम शायद अधिक सहायक होंगे। – swasheck

उत्तर

8

हां, सूची में आईडी की मात्रा प्रदर्शन को प्रभावित करेगी। एक नेटवर्क पैकेट उदाहरण के लिए, केवल इतना बड़ा है, और डेटाबेस सब शोर पार्स और यह की एक श्रृंखला में बदलने के लिए है:

WHERE foo.ID <> 2 
AND foo.ID <> 4 
AND foo.ID <> 5 
AND ... 

आप अपनी क्वेरी इस सेट के बारे में बताने के लिए अन्य तरीकों पर विचार करना चाहिए।

+4

तो यह 'AND' नहीं होगा' या 'मुझे लगता है ... – JNK

+2

हाँ, बहुत सच है। लेकिन बिंदु नहीं। :-) –

2

यहाँ कि क्वेरी का निराला पुनर्लेखन कि प्रदर्शन कर सकते हैं है थोड़ा बेहतर

SELECT * FROM foos 
LEFT JOIN 
(
    SELECT 2 id UNION 
    SELECT 4 UNION 
    SELECT 5 UNION 
    SELECT 6 UNION 
    SELECT 7 
) NOT_IDS 
USING (id) WHERE NOT_IDS.id IS NULL; 

के रूप में पालन करते हुए दिखाया गया है NOT_IDS सबक्वेरी काम करता है:

mysql> SELECT * FROM 
    -> (
    ->  SELECT 2 id UNION 
    ->  SELECT 4 UNION 
    ->  SELECT 5 UNION 
    ->  SELECT 6 UNION 
    ->  SELECT 7 
    ->) NOT_IDS; 
+----+ 
| id | 
+----+ 
| 2 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
+----+ 
5 rows in set (0.00 sec) 

mysql> 
+0

क्या इसका अनुवाद मौजूदा क्वेरी से भिन्न रूप से MySQL द्वारा किया जाएगा? मुझे लगता है कि सूची के स्रोत के आधार पर चौंकाने वाला हिस्सा अभी भी उस आंतरिक 'यूनियन' का निर्माण करेगा। लेकिन मेरे सिर में यह अभी भी 'id <> 2 और id <> 4 और आईडी <> 5 और आईडी <> 6 और आईडी <> 7' में अनुवाद करता है ... –

2
बस मस्ती के लिए

, और दिए गए अपने अद्यतन , मैं एक अलग रणनीति का सुझाव देने जा रहा हूं:

आप इस तरह की सारणी में शामिल हो सकते हैं ...

insert into db1.foos (cols) 
    select cols 
    from db2.foos src 
    left join db1.foos dst 
    on src.pk = dst.pk 
    where dst.othercolumn is null 

मुझे यकीन नहीं है कि ऑप्टिमाइज़र इसे कैसे संभालेगा या यदि यह तेज़ हो रहा है (आपकी इंडेक्सिंग रणनीति पर निर्भर करता है, तो मुझे लगता है) आप जो कर रहे हैं उससे ज्यादा।

0

डीबी एक ही सर्वर में हैं? यदि हां, तो आप बाएं जुड़ने के साथ बहु-डीबी क्वेरी बना सकते हैं और नल को ले सकते हैं। (यहां एक उदाहरण: Querying multiple databases at once)। अन्यथा आप एक संग्रहित प्रक्रिया कर सकते हैं, आईडी को स्ट्रिंग के साथ पास कर सकते हैं, और उन्हें नियमित अभिव्यक्ति के साथ विभाजित कर सकते हैं। मुझे एक ही समस्या है, लेकिन इन-मेमोरी डीबी और पोस्टग्रेस डीबी के भीतर। सौभाग्य से मेरी स्थिति है (में ...)

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