ORDER BY RAND() धीमा है क्योंकि डीबीएमएस को केवल कुछ पंक्तियों को रखने के लिए सभी पंक्तियों को पढ़ना है, उन सभी को क्रमबद्ध करना है। इसलिए इस क्वेरी का प्रदर्शन काफी हद तक तालिका में पंक्तियों की संख्या पर निर्भर करता है, और पंक्तियों की संख्या बढ़ने पर घट जाती है।
इसे ऑप्टिमाइज़ करने का कोई तरीका नहीं है।
हालांकि, विकल्प हैं:
आप लागू कर सकते हैं "5 यादृच्छिक पंक्तियाँ प्राप्त करें" 6 प्रश्न करके:
- तालिका में पंक्तियों की संख्या प्राप्त करें (आप इसे कैश कर सकते हैं)
-
OFFSET <random offset from 0 to $number_of_rows-1> LIMIT 1के साथ 5 क्वेरी करें (यानी कुछ यादृच्छिक ऑफसेट से केवल एक पंक्ति पढ़ें और वापस करें)उदाहरण के लिए:
SELECT * FROM Products OFFSET 42 LIMIT 1(नोट:अभी शामिल हुए बिना)इस तरह के प्रश्न बहुत तेज़ होते हैं और तालिका के आकार से लगभग स्वतंत्र समय में चलते हैं।
यह बहुतहोना चाहिए ORDER BY RAND() . से तेज ।
अब, प्रत्येक यादृच्छिक उत्पाद के लिए एक यादृच्छिक छवि प्राप्त करने के लिए:
SELECT *
FROM (
SELECT *
FROM Products
OFFSET 42 LIMIT 1
) p
JOIN ProductImages pi
ON pi.product_id = p.id
ORDER BY RAND()
LIMIT 1
आंतरिक क्वेरी अभी भी तेज़ है, और बाहरी केवल कुछ पंक्तियों को सॉर्ट कर रहा है (यह मानते हुए कि प्रति उत्पाद कुछ छवियां हैं), और इसलिए अभी भी रैंड () द्वारा ऑर्डर का उपयोग कर सकते हैं।