SELECT * FROM products <<-- select * is non-optimal
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<-- your problem is here
सबसे पहले prodid
. पर एक इंडेक्स लगाएं @ एंथनी का जवाब देखें।
पढ़ने के लिए क्वेरी बदलें:
SELECT only,the,fields,you,need FROM products
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
यदि आप सुनिश्चित करते हैं कि आपका IN
सूची को IN
. पर ऑफ़र करने से पहले आरोही क्रम में लगाया जाता है खंड, order by prodid
order by field(...
. के समान परिणाम देगा
- फ़ील्ड के बजाय फ़ंक्शन का उपयोग करने से इंडेक्स का उपयोग करने की कोई भी संभावना समाप्त हो जाती है, जिससे धीमापन आ जाता है।
select *
डेटा प्राप्त करेगा जिसकी आपको आवश्यकता नहीं हो सकती है, जिससे अतिरिक्त डिस्क एक्सेस, और अतिरिक्त मेमोरी उपयोग और अतिरिक्त नेटवर्क ट्रैफ़िक हो सकता है।- InnoDB पर, यदि आप केवल
select
अनुक्रमित फ़ील्ड, MySQL कभी तालिका नहीं पढ़ेगा, लेकिन केवल अनुक्रमणिका बचत समय (आपके मामले में यह शायद कोई समस्या नहीं है)
कुछ तरकीबें हैं जिनका आप उपयोग कर सकते हैं।
- यदि उत्पाद तालिका बहुत बड़ी नहीं है, तो आप इसे
memory
बना सकते हैं टेबल, जिसे रैम में स्टोर किया जाता है। बड़े टेबल के लिए ऐसा न करें, इससे अन्य चीजें धीमी हो जाएंगी।
आप केवलhash
का उपयोग कर सकते हैं मेमोरी टेबल पर इंडेक्स। - यदि प्रोडिड निरंतर हैं, तो आप
BETWEEN 1000 AND 1019
का उपयोग कर सकते हैं इसके बजायIN (1000, 1001 ..., 1019)