Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

रैंड () क्वेरी द्वारा धीमे ऑर्डर का अनुकूलन

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

आंतरिक क्वेरी अभी भी तेज़ है, और बाहरी केवल कुछ पंक्तियों को सॉर्ट कर रहा है (यह मानते हुए कि प्रति उत्पाद कुछ छवियां हैं), और इसलिए अभी भी रैंड () द्वारा ऑर्डर का उपयोग कर सकते हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं एक स्थापित सर्वर के बिना MySQL कार्यक्षेत्र के लिए क्लाइंट कॉन्फ़िगरेशन कैसे सेट कर सकता हूं?

  2. सभी विकल्प मानों का चयन करें php mysql

  3. mysqli तैयार कथन में कई पंक्तियाँ सम्मिलित करें

  4. PHP में बुरी तरह से स्वरूपित JSON को कैसे ठीक करें?

  5. phpunit के साथ पीडीओ का मज़ाक उड़ाना