मैं अपनी परियोजना में बहुत सारे मौजूदा प्रश्नों का अनुकूलन कर रहा हूं। Quassnoi के समाधान ने मुझे प्रश्नों को बहुत तेज करने में मदद की है! हालाँकि, मुझे सभी प्रश्नों में उक्त समाधान को शामिल करना कठिन लगता है, विशेषकर जटिल प्रश्नों के लिए जिसमें कई बड़ी मेज पर कई उपश्रेणियाँ शामिल हैं।
इसलिए मैं कम अनुकूलित समाधान का उपयोग कर रहा हूं। मौलिक रूप से यह उसी तरह काम करता है जैसे क्वासोई के समाधान।
SELECT accomodation.ac_id,
accomodation.ac_status,
accomodation.ac_name,
accomodation.ac_status,
accomodation.ac_images
FROM accomodation, accomodation_category
WHERE accomodation.ac_status != 'draft'
AND accomodation.ac_category = accomodation_category.acat_id
AND accomodation_category.acat_slug != 'vendeglatohely'
AND ac_images != 'b:0;'
AND rand() <= $size * $factor / [accomodation_table_row_count]
LIMIT $size
$size * $factor / [accomodation_table_row_count]
एक यादृच्छिक पंक्ति लेने की संभावना को पूरा करता है। रैंड () एक यादृच्छिक संख्या उत्पन्न करेगा। यदि रैंड छोटा है या संभाव्यता के बराबर है, तो पंक्ति का चयन किया जाएगा। यह प्रभावी रूप से तालिका आकार को सीमित करने के लिए एक यादृच्छिक चयन करता है। चूंकि एक मौका है कि यह परिभाषित सीमा की तुलना में कम वापस आएगा, हमें यह सुनिश्चित करने की आवश्यकता है कि हम पर्याप्त पंक्तियों का चयन कर रहे हैं। इसलिए हम $ आकार को एक $ कारक से गुणा करते हैं (मैं आमतौर पर $ कारक = 2 सेट करता हूं, ज्यादातर मामलों में काम करता है)। अंत में हम करते हैंlimit $size
समस्या अब साथ काम कर रही है outodation_table_row_count । यदि हमें तालिका आकार पता है, तो हम तालिका आकार को कठिन कोड बना सकते हैं। यह सबसे तेज़ चलेगा, लेकिन जाहिर है कि यह आदर्श नहीं है। यदि आप Myisam का उपयोग कर रहे हैं, तो टेबल काउंट प्राप्त करना बहुत कुशल है। चूँकि मैं innodb का उपयोग कर रहा हूँ, मैं केवल एक साधारण गणना + चयन कर रहा हूँ। आपके मामले में, यह इस तरह दिखेगा:
SELECT accomodation.ac_id,
accomodation.ac_status,
accomodation.ac_name,
accomodation.ac_status,
accomodation.ac_images
FROM accomodation, accomodation_category
WHERE accomodation.ac_status != 'draft'
AND accomodation.ac_category = accomodation_category.acat_id
AND accomodation_category.acat_slug != 'vendeglatohely'
AND ac_images != 'b:0;'
AND rand() <= $size * $factor / (select (SELECT count(*) FROM `accomodation`) * (SELECT count(*) FROM `accomodation_category`))
LIMIT $size
मुश्किल हिस्सा सही संभावना बाहर काम कर रहा है। जैसा कि आप निम्न कोड देख सकते हैं वास्तव में केवल रफ टेम्प टेबल की गणना करता है (वास्तव में, बहुत मोटा!): (select (SELECT count(*) FROM accomodation) * (SELECT count(*) FROM accomodation_category))
लेकिन आप इस तर्क को एक करीबी टेबल आकार का अनुमान देने के लिए परिष्कृत कर सकते हैं। ध्यान दें कि OVER- सेलेक्ट की गई पंक्तियों को चुनना बेहतर है। यानी यदि संभावना बहुत कम सेट की जाती है, तो आप पर्याप्त पंक्तियों का चयन नहीं करने का जोखिम उठाते हैं।
यह समाधान क्वासोई के समाधान की तुलना में धीमा चलता है क्योंकि हमें तालिका के आकार को पुनर्गणना करने की आवश्यकता है। हालाँकि, मुझे यह कोडिंग बहुत अधिक प्रबंधनीय लगती है। यह सटीकता + प्रदर्शन बनाम कोडिंग जटिलता के बीच एक व्यापार बंद है । कहा जाता है कि, बड़े तालिकाओं पर यह ऑर्डर ऑफ रैंड () की तुलना में अभी भी बहुत तेज है।
नोट: यदि क्वेरी तर्क अनुमति देता है, तो रैंडम सेलेक्शन को किसी भी जॉइन ऑपरेशंस से पहले करें।