2009-05-12 12 views
6

पर कई परिणामों को यादृच्छिक बनाने के लिए तेज़ है क्या यह MySQL सर्वर पर परिणामों के बड़े सेट के सॉर्ट ऑर्डर को यादृच्छिक करने के लिए तेज़ है या PHP में डेटा प्राप्त करने के बाद?MySQL सर्वर पर या PHP

क्या किसी के पास बैकअप के लिए कोई भी डेटा है, या यहां तक ​​कि अचूक अनुभव भी है?

+1

मैं यह दिखाने के लिए परीक्षण करता हूं कि इसके बारे में चिंता करने से पहले कोई समस्या मौजूद है या नहीं। इससे पहले कि इससे कोई फर्क नहीं पड़ता, आपके पास बहुत बड़ी मात्रा में डेटा होना चाहिए, मुझे उम्मीद है। वास्तव में, यह एक पोस्ट चुनने, इसे कार्यान्वित करने, स्विच करने और तुलना करने के बजाय, इसे पोस्ट करने और जवाब पचाने की मात्रा की तुलना करना दिलचस्प होगा। (बस अटकलें, आलोचना नहीं; हम सभी इन मानसिक अभ्यास करते हैं।) – dkretz

+0

हाँ, लेकिन अगर कोई इस सवाल का जवाब देता है, तो मैं समय के इस निवेश के बिना सीखूंगा, और मैं और अन्य अपना कोड सुधार सकते हैं। मुझे लगता है कि यह एक सवाल है कि इस पर ध्यान दिए बिना कि कोई समस्या वर्तमान में मौजूद है या नहीं। – nickf

उत्तर

5

मेरा शिक्षित अनुमान यह है कि MySQL हाथ जीतता है। यह डेटा को इस तरह से संभालने के लिए बनाया गया है। सॉर्टिंग के लिए सभी डेटा को PHP पर ले जाने के ऊपरी ओवरहेड को बूट करने का लाभ मिलता है।

आप निश्चित रूप से कुछ बेंचमार्किंग करके स्वयं को ढूंढ सकते हैं।

+0

मैं इस बात से सहमत हूं कि यह संभावित उत्तर है, हालांकि मैं अभी बेंचमार्क नहीं कर सकता, मुझे नहीं लगता कि मेरे पास इस समय पर्याप्त डेटा है, लेकिन मैं इसे निकट भविष्य में एक समस्या के रूप में देखता हूं। – UnkwnTech

1

MySQL में रैंड() का उपयोग निश्चित रूप से तेज हो जाएगा।

PHP के माध्यम से यादृच्छिक करने के लिए आपको डीबी से पूछताछ करना होगा और डेटा को मेमोरी में धक्का देना होगा, इसलिए आपके पास अपनी सॉर्ट प्रक्रिया में ओवरहेड जोड़ने का एक अतिरिक्त अतिरिक्त कदम है।

MySQL में, इस प्रकार की क्वेरी इंडेक्स किए गए मान द्वारा ऑर्डर करने जितनी तेज़ नहीं होगी, लेकिन यह अभी भी अत्यधिक अनुकूलित होगी।

0

ध्यान दें कि आप बयान से आदेश की वस्तु के रूप रैंड() का उपयोग करें:

select * from foo_table order by rand() limit 100 
4

यकीन के लिए आप MySQL तरफ करना चाहिए।

लेकिन ध्यान दें कि ORDER BY RAND()MySQL में बहुत अक्षम है क्योंकि यह filesort की आवश्यकता है।

SELECT * 
FROM (
     SELECT @cnt := COUNT(*) + 1, 
       @lim := 10 
     FROM t_random 
     ) vars 
STRAIGHT_JOIN 
     (
     SELECT r.*, 
       @lim := @lim - 1 
     FROM t_random r 
     WHERE (@cnt := @cnt - 1) 
       AND RAND() < @lim/@cnt 
     ) i 

प्रदर्शन जानकारी के लिए अपने ब्लॉग में इस लेख देखें::

एक के लिए

एक एकल तालिका स्कैन के साथ कुशलता से 10 यादृच्छिक पंक्तियों का चयन करने का तरीका देखें 1,000,000 रिकॉर्ड तालिका, यह 15 सेकेंड के बजाय एक सेकंड से भी कम समय में चलता है डीएस ORDER BY RAND() का उपयोग कर।