INNER JOIN के साथ, MySQL आम तौर पर सबसे छोटी पंक्तियों वाली तालिका से शुरू होगी। इस मामले में, यह तालिका finished
. से शुरू होता है और saved
. में संबंधित रिकॉर्ड की तलाश करता है saved.email
. पर अनुक्रमणिका का उपयोग करना ।
लेफ्ट जॉइन के लिए, (कुछ ऑप्टिमाइजेशन को छोड़कर) MySQL आम तौर पर रिकॉर्ड्स को क्रम में जोड़ता है (सबसे बाईं टेबल से शुरू)। इस मामले में, MySQL saved
तालिका से शुरू होता है , फिर प्रत्येक संबंधित रिकॉर्ड को finished
. में खोजने का प्रयास करता है . चूंकि कोई प्रयोग करने योग्य नहीं है finished.email
पर अनुक्रमणिका , इसे प्रत्येक लुक अप के लिए एक पूर्ण स्कैन करना होगा।
संपादित करें
अब जब आपने अपना स्कीमा पोस्ट कर दिया है, तो मैं देख सकता हूं कि MySQL इंडेक्स को अनदेखा कर रहा है (finished.email
) utf8
. से जाने पर से latin1
अक्षरों का समूह। आपने प्रत्येक कॉलम के लिए कैरेक्टर सेट और कॉलेशन पोस्ट नहीं किए हैं, इसलिए मैं टेबल के लिए डिफॉल्ट कैरेक्टर सेट से जा रहा हूं। MySQL के लिए अनुक्रमणिका का उपयोग करने के लिए संयोजन संगत होना चाहिए।
MySQL एक latin1
. के साथ जबरदस्ती (अपग्रेड) कर सकता है संयोजन, जो बहुत सीमित है, एक utf8
. तक संयोजन जैसे unicode_ci
(इसलिए पहली क्वेरी saved.email
. पर अनुक्रमणिका का उपयोग कर सकती है latin1
. को अपग्रेड करके utf8
. से मिलान ), लेकिन विपरीत सत्य नहीं है (दूसरी क्वेरी finished.email
पर अनुक्रमणिका का उपयोग नहीं कर सकती चूंकि यह एक utf8
को डाउनग्रेड नहीं कर सकता है latin1
. तक का मिलान )।
समाधान दोनों ईमेल स्तंभों को एक संगत मिलान में बदलना है, शायद उन्हें समान वर्ण सेट और संयोजन बनाकर सबसे आसानी से।