क्वेरी को इस तरह लिखें:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
निर्दिष्ट न करें कि कौन सी अनुक्रमणिका का उपयोग करना है।
WHERE
. से शुरू खंड, ऐसा लगता है कि शायद उपयोगी बनें:INDEX(status)
. लेकिन चूंकि "स्थिति" निम्न कार्डिनैलिटी वाले "ध्वज" की तरह लगती है, इसलिए अनुकूलक हो सकता है सूचकांक को अनदेखा करने का निर्णय लें और बस एक टेबल स्कैन करें। यह ठीक है। यह ठीक है क्योंकि इंडेक्स और डेटा के बीच उछाल की तुलना में टेबल स्कैन करना तेज़ होता है, जब इंडेक्स बहुत चुनिंदा नहीं होता है। किसी भी मामले में, निर्णय को अनुकूलक पर छोड़ दें।
अब जबकि यह orders
के साथ काम कर रहा है , इसे JOIN
. की आवश्यकता है users
. के लिए . ऐसा करने का एकमात्र तरीका id
. पर एक इंडेक्स होना है . उस नाम ("आईडी") का अर्थ है कि यह PRIMARY KEY
हो सकता है , यह है? (कृपया SHOW CREATE TABLE
provide प्रदान करें ।)
आपके द्वारा उल्लिखित दूसरी क्वेरी लिखी जानी चाहिए
SELECT * FROM users WHERE id=33
और, जैसा कि पहले ही चर्चा की जा चुकी है, अनुक्रमणिका (PRIMARY KEY
?) id
. पर सही बात है।
कोई फायदा नहीं है (दिए गए SELECTs
. के लिए , कम से कम) INDEX(status, id_user)
. के लिए . आपके चयन में सभी कॉलम शामिल हैं (*
); इसने केवल id_user
प्राप्त किया था , तो ऐसा सूचकांक "कवर" होगा, और इसका कुछ लाभ होगा।