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

एक MySQL डेटाबेस से यादृच्छिक डेटा प्राप्त करना लेकिन डेटा दोहराना नहीं

यादृच्छिक पंक्तियों का चयन करना हमेशा मुश्किल होता है, और कोई भी सही समाधान नहीं है जिसमें कुछ समझौता शामिल न हो। या तो प्रदर्शन से समझौता करें, या यादृच्छिक वितरण से समझौता करें, या डुप्लीकेट आदि चुनने की संभावना पर समझौता करें।

जैसा कि @JakeGould उल्लेख करता है, ORDER BY RAND() . के साथ कोई समाधान अच्छी तरह से स्केल नहीं करता है। जैसे-जैसे आपकी तालिका में पंक्तियों की संख्या बड़ी होती जाती है, संपूर्ण तालिका को एक फाइलसॉर्ट में छाँटने की लागत और भी बदतर होती जाती है। जेक सही है कि सॉर्ट ऑर्डर यादृच्छिक होने पर क्वेरी को कैश नहीं किया जा सकता है। लेकिन मुझे इसकी इतनी परवाह नहीं है क्योंकि मैं आमतौर पर वैसे भी क्वेरी कैश को अक्षम कर देता हूं (इसकी अपनी स्केलेबिलिटी समस्याएं हैं)।

एक पंक्तिबद्ध स्तंभ बनाकर और अद्वितीय क्रमागत मान निर्दिष्ट करके तालिका में पंक्तियों को पूर्व-यादृच्छिक बनाने का समाधान यहां दिया गया है:

ALTER TABLE products ADD COLUMN rownum INT UNSIGNED, ADD KEY (rownum);
SET @rownum := 0;
UPDATE products SET rownum = (@rownum:[email protected]+1) ORDER BY RAND();

अब आप एक इंडेक्स लुकअप द्वारा एक यादृच्छिक पंक्ति प्राप्त कर सकते हैं, बिना छँटाई:

SELECT * FROM products WHERE rownum = 1;

या आप अगली यादृच्छिक पंक्ति प्राप्त कर सकते हैं:

SELECT * FROM products WHERE rownum = 2;

या आप एक बार में 10 यादृच्छिक पंक्तियाँ प्राप्त कर सकते हैं, या कोई अन्य संख्या जो आप चाहते हैं, बिना किसी डुप्लिकेट के:

SELECT * FROM products WHERE rownum BETWEEN 11 and 20;

आप जब चाहें, फिर से रैंडमाइज़ कर सकते हैं:

SET @rownum := 0;
UPDATE products SET rownum = (@rownum:[email protected]+1) ORDER BY RAND();

रैंडम सॉर्टिंग करना अभी भी महंगा है, लेकिन अब आपको इसे प्रत्येक SELECT क्वेरी पर करने की आवश्यकता नहीं है। आप इसे शेड्यूल पर कर सकते हैं, उम्मीद है कि ऑफ-पीक समय पर।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कई से कई रिश्ते

  2. MySQL के साथ कभी भी अधिकांश उपयोगकर्ताओं की ऑनलाइन गणना करें

  3. समूहीकरण के बिना अधिकतम प्राप्त करना

  4. जब लोग पंजीकरण करते हैं तो डुप्लिकेट उपयोगकर्ता नाम कैसे रोकें?

  5. मैट्रिक्स तालिका बनाने के लिए SQL