2009-02-18 13 views
28

सबसे पहले, मैं दोनों के बीच अंतर को पहचान अन्य बातों के समान होने के नाते, एक सटीक स्ट्रिंग मैच जो अधिक कुशल है के लिए:तरह का प्रयोग सटीक स्ट्रिंग मैच के लिए बनाम =

SELECT field WHERE 'a' = 'a'; 

या:

SELECT field WHERE 'a' LIKE 'a'; 

या: क्या अंतर इतना महत्वहीन है कि इससे कोई फर्क नहीं पड़ता?

+4

:

SELECT field WHERE name = binary 'pax' 

आप की तरह कुछ के साथ इस परीक्षण कर सकते हैं:

आप एक उचित समानता की जांच करना चाहते हैं, तो आप binary कीवर्ड का उपयोग कार्यान्वयन, स्ट्रिंग तुलना के स्वाद की लागत डिस्क से डेटा को स्थानांतरित करने की लागत से बौना जा रहा है। लिखें कि आप वास्तव में क्या मतलब है और प्रोग्रामिंग के साथ आगे बढ़ें। –

+2

यह पहले स्टैक ओवरफ्लो पर [यहां] (http://stackoverflow.com/questions/543580/equals-vs-like) को कवर किया गया है। आशा है कि ये आपकी मदद करेगा। – user34867

+0

धन्यवाद, मैंने पोस्ट करने से पहले इसकी खोज की लेकिन इसे किसी भी तरह से नहीं देखा। – mluebke

उत्तर

29

मैं कहूंगा कि = तुलनित्र तेज़ होगा। शब्दावली सामान्य मैचों के लिए एक और व्याख्यात्मक प्रणाली की तुलना नहीं भेजती है। इसके बजाए इंजन सिर्फ मिलान या आगे बढ़ने में सक्षम है। काम पर हमारे डीबी में लाखों पंक्तियां हैं और एक = हमेशा तेज है।

3

एक सभ्य डीबीएमएस में, डीबी इंजन यह पहचान लेगा कि स्ट्रिंग में कोई वाइल्डकार्ड वर्ण नहीं थे और स्पष्ट रूप से इसे शुद्ध समानता में बदल दिया (आवश्यक रूप से = के समान नहीं)। तो, आपको शुरुआत में केवल एक छोटा सा प्रदर्शन मारा जाएगा, आमतौर पर किसी सभ्य आकार की क्वेरी के लिए नगण्य होगा।

हालांकि, MySQL = ऑपरेटर आवश्यक तरीके से कार्य नहीं करता है (शुद्ध शुद्धता जांच के रूप में)। विशेष रूप से, यह नहीं डिफ़ॉल्ट रूप से खाते अवांछित स्पेस में CHAR और VARCHAR डेटा के लिए ले करता है, जिसका अर्थ है कि:

SELECT age WHERE name = 'pax' 

'pax<one space>'और'pax<a hundred spaces>''pax' के लिए आप जिन पंक्तियों को दे देंगे,। एक पूरी तरह से braindead बैरिंग

mysql> create table people (name varchar(10)); 

mysql> insert into people value ('pax'); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('notpax'); 

mysql> select count(*) from people where name like 'pax'; 
1 

mysql> select count(*) from people where name = 'pax'; 
4 

mysql> select count(*) from people where name = binary 'pax'; 
1 
+0

अच्छा अपडेट, लेकिन इस प्रश्न के लिए अधिक प्रासंगिकता, 'LIKE' "प्रति-चरित्र आधार पर मिलान करता है", जिसका अर्थ है कि इंजन' LIKE' को '' 'अनुकूलित नहीं कर सकता है, इसलिए 'LIKE' लगभग निश्चित रूप से धीमा हो जाएगा। इसका मतलब यह भी है कि दो ऑपरेटर संयोजन के आधार पर अलग-अलग व्यवहार करते हैं, लेकिन यह इस प्रश्न के लिए कम प्रासंगिक है। – Flimzy

+0

@Flimzy क्या आप थोड़ा सा विस्तार कर सकते हैं? AFAIK, '=' प्रति-चरित्र आधार पर एक तुलना (निश्चित रूप से मेल नहीं खाती) करता है, जब तक कि आप कहीं भी 'बाइनरी' निर्दिष्ट न करें। – Binarus

+1

@ बिनारस '=' की तुलना समग्र पात्रों के लिए अलग है, जैसे 'ä'। देखें [विवरण के लिए मैनुअल] (https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html)। – Flimzy

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