आवश्यक बिंदु यह है कि यदि डेटाबेस को तुलना के टेबल-साइड पर रूपांतरण करना है तो इंडेक्स का उपयोग नहीं किया जा सकता है।
इसके अलावा, DB हमेशा Strings -> Numbers को कवर करता है क्योंकि यह नियतात्मक तरीका है (अन्यथा 1 को '01', '001' में परिवर्तित किया जा सकता है जैसा कि टिप्पणियों में बताया गया है)।
इसलिए, अगर हम उन दो मामलों की तुलना करें जो आपको भ्रमित करते हैं:
-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';
डीबी स्ट्रिंग '1' को नंबर 1 में परिवर्तित करता है और फिर क्वेरी निष्पादित करता है। अंत में दोनों तरफ इंट होता है इसलिए यह इंडेक्स का उपयोग कर सकता है।
-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;
फिर से, यह स्ट्रिंग को संख्याओं में परिवर्तित करता है। हालांकि, इस बार उसे टेबल में स्टोर डेटा को कन्वर्ट करना है। वास्तव में, आप cast(str_column as int) = 1
जैसी खोज कर रहे हैं . इसका मतलब है, अब आप अनुक्रमित डेटा पर खोज नहीं कर रहे हैं, डीबी नहीं अनुक्रमणिका का उपयोग करें।
अधिक जानकारी के लिए कृपया इसे देखें:
- http://use-the- index-luke.com/sql/where-clause/obfuscation/numeric-strings
- http://use- the-index-luke.com/sql/where-clause/functions/case-inसंवेदनशील-खोज