अपडेट 2016
यह समाधान अनुक्रमित स्तंभ . का उपयोग करके सबसे अच्छा काम करता है ।
यहां 100,000 पंक्तियों के साथ चिह्नित और अनुकूलित क्वेरी बेंच का एक सरल उदाहरण दिया गया है।
अनुकूलित:300ms
SELECT
g.*
FROM
table g
JOIN
(SELECT
id
FROM
table
WHERE
RAND() < (SELECT
((4 / COUNT(*)) * 10)
FROM
table)
ORDER BY RAND()
LIMIT 4) AS z ON z.id= g.id
सीमा राशि के बारे में नोट करें :सीमा 4 और 4/गिनती(*)। 4s की संख्या समान होनी चाहिए। आप कितने लौटाते हैं इसे बदलने से गति पर इतना प्रभाव नहीं पड़ता है। सीमा 4 और सीमा 1000 पर बेंचमार्क समान हैं। 10,000 की सीमा ने इसे 600ms तक ले लिया
शामिल होने के बारे में नोट करें :केवल आईडी को रैंडमाइज़ करना पूरी पंक्ति को रैंडमाइज़ करने की तुलना में तेज़ है। चूंकि इसे पूरी पंक्ति को स्मृति में कॉपी करना है, फिर इसे यादृच्छिक बनाएं। जॉइन कोई भी टेबल हो सकती है जो सबक्वेरी से जुड़ी हो, यह टेबलस्कैन को रोकने के लिए है।
ध्यान दें कि खंड कहां है :जहां गिनती यादृच्छिक किए जा रहे परिणामों की मात्रा को सीमित करती है। यह परिणामों का एक प्रतिशत लेता है और उन्हें संपूर्ण तालिका के बजाय क्रमबद्ध करता है।
उप क्वेरी नोट करें :यदि जॉइन कर रहा है और अतिरिक्त जहां क्लॉज की स्थिति है, तो आपको उन्हें सबक्वायरी और सबसबक्वेरी दोनों में रखना होगा। सटीक गणना करने और सही डेटा वापस लेने के लिए।
अप्रकाशित:1200ms
SELECT
g.*
FROM
table g
ORDER BY RAND()
LIMIT 4
पेशेवर
order by rand()
. से 4 गुना तेज . यह समाधान अनुक्रमित कॉलम वाली किसी भी तालिका के साथ काम कर सकता है।
विपक्ष
यह जटिल प्रश्नों के साथ थोड़ा जटिल है। उपश्रेणियों में 2 कोड आधार बनाए रखने की आवश्यकता है