2010-08-26 12 views
5

मैं इस तरह कॉलम युक्त तालिका है:MySQL अनुकूलन, "की तरह" बनाम "="

| Country.Number | CountryName | 
| US.01   | USA  | 
| US.02   | USA  | 

मैं करने के लिए इस संशोधित करने के लिए करना चाहते हैं:

| Country | Number | CountryName | 
| US  | 01  | USA  | 
| US  | 02  | USA  | 

अनुकूलन के बारे में, वहाँ है प्रदर्शन में एक फर्क है कि अगर मैं का उपयोग करें:

select * from mytable where country.number like "US.%" 

या

select * from mytable where country = "US" 
+2

आपके पास 'देश' नाम की 2 पंक्तियां हैं। –

+1

@ रॉकेट: आपका मतलब कॉलम है? –

+2

हां, मैं डिस्लेक्सिक हूं, क्षमा करें। –

उत्तर

7

प्रदर्शन अंतर इस विशेष मामले में कम से कम कम हो जाएगा, क्योंकि MySQL "US.%" पर एक इंडेक्स का उपयोग करता है। "%.US" (वाइल्डकार्ड सामने है) जैसे कुछ खोजते समय प्रदर्शन गिरावट अधिकतर महसूस की जाती है। चूंकि यह सूचकांक का उपयोग किए बिना एक टेबलकेन करता है।

संपादित: आप इस तरह इसे देख सकते हैं:

MySql आंतरिक रूप से दुकानों varchar सूचकांक पहले प्रतीक जड़ जा रहा है और प्रत्येक अगले अक्षर शाखाओं के साथ पेड़ की तरह।

तो = "US" की खोज करते समय यह U की तलाश करता है, फिर S के लिए एक चरण नीचे चला जाता है और फिर यह सुनिश्चित करने के लिए कि यह मूल्य का अंत है। यह तीन कदम है।

LIKE "US.%" के लिए सर्च कर रहे हैं यह U के लिए फिर से लग रहा है, तो S, तो . और फिर खोज बंद हो जाता है और परिणाम प्रदर्शित करता है - यह है कि केवल तीन चरणों भी है के रूप में यह नहीं परवाह करता है कि क्या मूल्य वहाँ समाप्त हो गया।

EDIT2: मैं इस तरह के डेटाबेस denormalization को बढ़ावा देने में किसी भी तरह से नहीं कर रहा हूं, मैं बस अपना ध्यान आकर्षित करना चाहता था कि यह मामला उतना आसान नहीं हो सकता है जितना कि यह पहली नज़र में दिखता है।

7

बाद में क्वेरी:

select * from mytable where country = "US" 

बहुत तेजी से क्योंकि mySQL LIKE क्वेरी के विपरीत वाइल्डकार्ड पैटर्न देखने के लिए नहीं है होना चाहिए। यह सिर्फ उस मान को देखता है जिसे बराबर किया गया है।

+1

मेरा मानना ​​है कि आप गलत हैं। यह पैटर्न की तलाश नहीं करता है, लेकिन पहले तीन अक्षरों के लिए सूचकांक का उपयोग करता है और तुरंत परिणाम प्रदर्शित करता है। यह '=" यूएस "से तेज हो सकता है लेकिन * बहुत * नहीं। – raveren

+0

बस मैन्युअल क्वेरी चल रहा है मुझे कुछ सुंदर असंगत परिणाम मिल गए हैं। प्रश्नों की पहली जोड़ी पर, '=' 'like' के लिए _17.49s_ बनाम 19.18s लिया। दूसरे रन पर, यह 3.20 बनाम _0.42s_ था। और तीसरे रन पर, _0.39s_ बनाम 0.42s। प्रत्येक रन पर, दोनों प्रश्नों को निष्पादित करने के लिए या तो 0.41 या 0.3 9 को निष्पादित किया गया, बिना प्रश्नों के 10 अतिरिक्त सेट के बाद किसी भी प्रश्न के लिए कोई फायदा नहीं हुआ। मुझे लगता है कि आपको एक प्रोफाइलर का उपयोग करने की आवश्यकता होगी जैसे कि पिस्कवोर अधिक निश्चित परिणाम प्राप्त करने का सुझाव देता है। लेकिन ज्यादातर मामलों में यह शायद अनावश्यक सूक्ष्म अनुकूलन है। –

+1

'SELECT sql_no_cache ...' का उपयोग करें। वैसे भी, '17.4 9 बनाम बनाम 1 9 .18' वास्तव में छोटा है। – raveren

3

कॉलम देश पर कोई अनुक्रमणिका होने पर दूसरा तेज़ है। परिणाम बनाने के लिए MySQL को कम इंडेक्स प्रविष्टियों को स्कैन करना होगा।

4

यदि आपको अनुकूलित करने की आवश्यकता है, तो like से बेहतर तरीका है।

क्यों?

  • एक = या तो स्ट्रिंग के साथ बिल्कुल वैसा ही है और यह सच है या यह मेल नहीं खाता और यह बात गलत है।
  • इसी तरह, MySQL को स्ट्रिंग और टेस्ट की तुलना करना चाहिए यदि अन्य स्ट्रिंग मास्क से मेल खाती है, और इसमें अधिक समय लगता है और अधिक संचालन की आवश्यकता होती है।

तो अपने डेटाबेस के लिए, SELECT * FROM 'mytable' WHERE country = "US" का उपयोग करें।

2

तकनीकी रूप से प्रश्न का उत्तर नहीं है .. लेकिन ... मैं उन्हें समझने के लिए पर्याप्त रूप से पर्याप्त होने के लिए समझूंगा (आमतौर पर) पदार्थ - इस प्रकार "=" का उपयोग करना बेहतर होगा क्योंकि यह इरादा प्रदर्शित करता है एक और स्पष्ट तरीका।

1

क्यों आप सिर्फ देश_आईडी को एक छोटे से हस्ताक्षर नहीं करते हैं और एक iso_code varchar (3) कॉलम अद्वितीय है? (आपको सभी बीएस से बचाता है)

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