आप इस मामले में किसी अनुक्रमणिका का उपयोग नहीं कर सकते, क्योंकि आप RANGE
. का उपयोग करते हैं छानने की स्थिति।
अगर आप कुछ इस तरह इस्तेमाल करेंगे:
SELECT *
FROM values_table this_
WHERE this_.value1 = @value
ORDER BY
value2
LIMIT 10
, फिर (VALUE1, VALUE2)
. पर एक समग्र अनुक्रमणिका बनाना फ़िल्टरिंग और ऑर्डरिंग दोनों के लिए उपयोग किया जाएगा।
लेकिन आप एक श्रेणीबद्ध स्थिति का उपयोग करते हैं, इसलिए आपको वैसे भी आदेश देना होगा।
आपका संयुक्त सूचकांक इस तरह दिखेगा:
value1 value2 ----- ------ 1 10 1 20 1 30 1 40 1 50 1 60 2 10 2 20 2 30 3 10 3 20 3 30 3 40
, और यदि आप 1
. का चयन करते हैं और 2
value1
. में , आपको अभी भी value2
. का पूरा सॉर्ट किया गया सेट नहीं मिलता है ।
अगर आपका इंडेक्स value2
. पर है बहुत चयनात्मक नहीं है (यानी कई DISTINCT value2
. नहीं हैं तालिका में), आप कोशिश कर सकते हैं:
CREATE INDEX ix_table_value2_value1 ON mytable (value2, value1)
/* Note the order, it's important */
SELECT *
FROM (
SELECT DISTINCT value2
FROM mytable
ORDER BY
value2
) q,
mytable m
WHERE m.value2 >= q.value2
AND m.value2 <= q.value2
AND m.value1 BETWEEN 13123123 AND 123123123
इसे SKIP SCAN
. कहा जाता है पहुँच विधि। MySQL
सीधे तौर पर इसका समर्थन नहीं करता है, लेकिन इसका अनुकरण इस तरह किया जा सकता है।
RANGE
इस मामले में एक्सेस का उपयोग किया जाएगा, लेकिन संभवत:आपको तब तक कोई प्रदर्शन लाभ नहीं मिलेगा जब तक DISTINCT value2
लगभग 1%
. से कम शामिल हैं पंक्तियों की।
नोट का उपयोग:
m.value2 >= q.value2
AND m.value2 <= q.value2
के बजाय
m.value2 = q.value2
यह MySQL
बनाता है RANGE
प्रदर्शन करें प्रत्येक लूप पर जाँच कर रहा है।