IN
=
. के बीच की तरह है और एक 'रेंज'। इसलिए, मैं प्रश्न पर शीर्षक के साथ प्रश्नचिह्न लगाता हूं। दो श्रेणियों को अनुकूलित करना लगभग असंभव है; एक IN
साथ ही एक श्रेणी में अनुकूलन की कुछ संभावना होती है।
. के आधार पर
WHERE `StartedAt` >= FROM_UNIXTIME(1518990000)
AND `StartedAt` < FROM_UNIXTIME(1518998400)
AND `DeviceId` IN (
UNHEX('00030000000000000000000000000000'),
UNHEX('000300000000000000000000000181cd'),
UNHEX('000300000000000000000000000e7cf6'),
UNHEX('000300000000000000000000000e7cf7'),
UNHEX('000300000000000000000000000f423f')
) AND `MarkedForDeletion` = FALSE
मैं 2 इंडेक्स प्रदान करूंगा और ऑप्टिमाइज़र को यह तय करने दूंगा कि किसका उपयोग करना है:
INDEX(MarkedForDeletion, StartedAt, DeviceId)
INDEX(MarkedForDeletion, DeviceId, StartedAt)
MySQL/MariaDB के कुछ नए संस्करण छलांग लगा सकते हैं और सेकंड में सभी 3 स्तंभों का उपयोग कर सकते हैं अनुक्रमणिका। सभी संस्करणों में किसी भी इंडेक्स के पहले 2 कॉलम इसे उम्मीदवार बनाते हैं। चुनाव आंकड़ों से प्रेरित हो सकता है, और 'सही' विकल्प हो सकता है (या नहीं भी)।
चूंकि AlarmId
NULL
नहीं हो सकता , पैटर्न का उपयोग करें:COUNT(*)
।
उस परिवर्तन को करने के बाद, मेरी प्रत्येक अनुक्रमणिका "कवर" कर रही है, जिससे प्रदर्शन में अतिरिक्त वृद्धि हो रही है।