Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

SQL प्रदर्शन यूनियन बनाम OR

या तो आपके द्वारा पढ़ा गया लेख एक खराब उदाहरण का उपयोग करता है, या आपने उनकी बात का गलत अर्थ निकाला है।

select username from users where company = 'bbc' or company = 'itv';

यह इसके बराबर है:

select username from users where company IN ('bbc', 'itv');

MySQL company . पर एक इंडेक्स का उपयोग कर सकता है इस प्रश्न के लिए ठीक है। कोई यूनियन करने की आवश्यकता नहीं है।

अधिक पेचीदा मामला वह है जहां आपके पास OR . है ऐसी स्थिति जिसमें दो भिन्न शामिल हैं कॉलम।

select username from users where company = 'bbc' or city = 'London';

मान लीजिए कि company . पर एक अनुक्रमणिका है और city . पर एक अलग अनुक्रमणिका . यह देखते हुए कि MySQL आमतौर पर किसी दिए गए प्रश्न में प्रति तालिका केवल एक अनुक्रमणिका का उपयोग करता है, इसे किस अनुक्रमणिका का उपयोग करना चाहिए? यदि यह company . पर अनुक्रमणिका का उपयोग करता है , इसे अभी भी पंक्तियों को खोजने के लिए एक टेबल-स्कैन करना होगा जहां city लंदन है। यदि यह city . पर अनुक्रमणिका का उपयोग करता है , इसे पंक्तियों के लिए एक टेबल-स्कैन करना होगा जहां company बीबीसी है।

UNION समाधान इस प्रकार के मामले के लिए है।

select username from users where company = 'bbc' 
union
select username from users where city = 'London';

अब प्रत्येक उप-क्वेरी अपनी खोज के लिए अनुक्रमणिका का उपयोग कर सकती है, और उप-क्वेरी के परिणाम UNION द्वारा संयुक्त होते हैं ।

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

मेरी प्रतिक्रिया यह है कि UNION होने से पहले अनुक्रमणिका परिणाम सेट को कम संख्या में पंक्तियों में कम करने में मदद करती है। UNION वास्तव में डुप्लिकेट को समाप्त करता है, लेकिन ऐसा करने के लिए उसे केवल छोटे परिणाम सेट को सॉर्ट करना होगा। ऐसे मामले हो सकते हैं जहां WHERE क्लॉज तालिका के एक महत्वपूर्ण हिस्से से मेल खाते हैं, और UNION के दौरान सॉर्ट करना उतना ही महंगा है जितना कि टेबल-स्कैन करना। लेकिन अनुक्रमित खोजों द्वारा परिणाम सेट को कम करना अधिक सामान्य है, इसलिए तालिका-स्कैन की तुलना में छँटाई बहुत कम खर्चीली है।

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL अनुक्रमणिका - सर्वोत्तम अभ्यास क्या हैं?

  2. विंडोज़ पर MySQL 8 कैसे स्थापित करें

  3. क्या MySQL प्रश्नों में 'LIMIT 1' जोड़ने से वे तेज़ हो जाते हैं जब आप जानते हैं कि केवल 1 परिणाम होगा?

  4. Django की प्राथमिक कुंजी को एक अलग पूर्णांक के साथ कैसे बदलें जो उस तालिका के लिए अद्वितीय है

  5. MySQL में एक स्ट्रिंग से रिक्त स्थान कैसे निकालें