मेरा मानना है कि ऐसा इसलिए है क्योंकि MySQL स्थानिक अनुक्रमित विलय का समर्थन नहीं करता है। यकीन नहीं होता कि यह अभी भी सच है, लेकिन मैंने इसे अतीत में कहीं पढ़ा है। यदि आपके पास OR स्टेटमेंट है, तो स्थानिक इंडेक्स का उपयोग नहीं किया जाता है
आपके मामले में, आप पॉइंट्स.आईडी =1 कहां कर रहे हैं, यह एक सीधा चयन है जिसमें एक परिणाम लौटाया जाता है जो एमबीकंटेन्स में उपयोग किया जाता है। वह सूचकांक का उपयोग करता है।
जब आप पॉइंट्स.इन (1,2,3) जोड़ते हैं, जो 3 परिणाम देता है और प्रत्येक को श्रेणी तालिका में मैप करने की आवश्यकता होती है, इसलिए काम नहीं कर रहा है
परिणाम
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE points range PRIMARY PRIMARY 4 NULL 3 100.00 Using where
1 SIMPLE ranges ALL poly NULL NULL NULL 6467418 100.00
आप ऐसा करके पॉइंट टेबल के बिना अपने परीक्षण को सरल बना सकते हैं:चुनें * उन श्रेणियों से जहां mbrcontains(poly, GEOMFROMWKB(POINT(0, 0)))
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE ranges range poly poly 34 NULL 1 100.00 Using where
और अब यह; चुनें * उन श्रेणियों से जहां mbrcontains(poly, GEOMFROMWKB(POINT(0, 0))) या mbrcontains(poly, GEOMFROMWKB(POINT(10, 10)))
परिणाम
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE ranges ALL poly NULL NULL NULL 6467418 100.00 Using where
देखें कि दूसरे मामले में, आप अनुक्रमणिका का उपयोग नहीं कर रहे हैं और केवल स्कैनिंग कर रहे हैं।
आप प्रत्येक विशिष्ट बिंदु के लिए यूनियन बनाकर क्वेरी को इंडेक्स का उपयोग करने के लिए मजबूर कर सकते हैं लेकिन मुझे यकीन नहीं है कि यह तेज़ होगा या नहीं। मैंने स्थानीय स्तर पर कुछ परीक्षण किए और यह आपकी पहली क्वेरी की तुलना में थोड़ा धीमा था।
EXPLAIN EXTENDED
SELECT *
FROM points
FORCE INDEX (PRIMARY )
LEFT JOIN ranges
FORCE INDEX ( poly ) ON mbrcontains( poly, point )
WHERE points.id = 1
UNION DISTINCT
SELECT *
FROM points
FORCE INDEX (PRIMARY )
LEFT JOIN ranges
FORCE INDEX ( poly ) ON mbrcontains( poly, point )
WHERE points.id = 2
UNION DISTINCT
SELECT *
FROM points
FORCE INDEX (PRIMARY )
LEFT JOIN ranges
FORCE INDEX ( poly ) ON mbrcontains( poly, point )
WHERE points.id = 3
परिणाम
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY points const PRIMARY PRIMARY 4 const 1 100.00
1 PRIMARY ranges range poly poly 34 NULL 1 100.00 Using where
2 UNION points const PRIMARY PRIMARY 4 const 1 100.00
2 UNION ranges range poly poly 34 NULL 1 100.00 Using where
3 UNION points const PRIMARY PRIMARY 4 const 1 100.00
3 UNION ranges range poly poly 34 NULL 1 100.00 Using where
NULL UNION RESULT <union1,2,3> ALL NULL NULL NULL NULL NULL NULL