प्रश्न के लिए:
WHERE NOW() >= date_from
AND NOW() <= date_to
एक यौगिक सूचकांक (date_from, date_to)
बेकार है।
दोनों इंडेक्स बनाएं: (date_from)
और (date_to)
और SQL ऑप्टिमाइज़र प्रत्येक बार उपयोग करने का निर्णय लेने दें। मूल्यों और चयनकता के आधार पर, अनुकूलक एक या अन्य अनुक्रमणिका चुन सकता है। या उनमें से कोई भी नहीं। एक इंडेक्स बनाने का कोई आसान तरीका नहीं है जो दोनों स्थितियों को ध्यान में रखेगा।
(एक स्थानिक सूचकांक इस तरह के एक शर्त अनुकूलन करने के लिए, यदि आप दिनांक उसका अनुवाद कर सकें अक्षांश और देशांतर के लिए इस्तेमाल किया जा सकता है)।
अद्यतन
मेरे गलती। (date_from, date_to, object_id)
पर एक सूचकांक वास्तव में इस क्वेरी के लिए कुछ स्थितियों में उपयोग किया जा सकता है और वास्तव में उपयोग किया जा सकता है। यदि NOW() <= date_from
की चयनिता काफी अधिक है, तो अनुकूलक तालिका पर एक पूर्ण स्कैन करने या अन्य अनुक्रमणिका का उपयोग करने से, इस अनुक्रमणिका का उपयोग करने का विकल्प चुनता है। ऐसा इसलिए है क्योंकि यह एक कवरिंग इंडेक्स है, जिसका अर्थ है कि तालिका से प्राप्त करने के लिए कोई डेटा आवश्यक नहीं है, केवल इंडेक्स डेटा से पढ़ना आवश्यक है।
मामूली नोट (प्रदर्शन से संबंधित नहीं, केवल क्वेरी की शुद्धता)। जबकि CURRENT_DATE()
एक DATE
देता है, समय हिस्सा बिना
WHERE CURRENT_DATE() >= date_from
AND CURRENT_DATE() <= date_to
NOW()
फ़ंक्शन एक DATETIME
,: यदि आप इस चाहते
WHERE CURRENT_DATE() >= date_from
AND (CURRENT_DATE() + INTERVAL 1 DAY <= date_to
OR (CURRENT_DATE() = NOW()
AND CURRENT_DATE() = date_to
)
)
क्या आप वाकई कि चाहते हैं या कर रहे हैं: अपने हालत बराबर है करने के लिए।
स्रोत
2012-02-17 16:57:24
मुझे लगता है date_from बजाय सूचकांक बनाने के लिए संयुक्त –
आप [शायद] गलत लग रहा है बेहतर है। कहें कि कुछ वस्तु के लिए 10 पंक्तियां हैं। 8 में अतीत में समाप्ति तिथि है, 1 "वर्तमान" है, और 1 "भविष्य" है। उनमें से कितने "अब()> date_from" (उत्तर: केवल एक) द्वारा फ़िल्टर किए जाते हैं और कितने लोग "अब()