Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

स्थानिक mysql अनुक्रमणिका पर जुड़ता है

मेरा मानना ​​​​है कि ऐसा इसलिए है क्योंकि 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     


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या एक MySQL संग्रहीत प्रक्रिया के लिए डिफ़ॉल्ट पैरामीटर होना संभव है?

  2. mysql_real_escape_string() जोड़ने से रिक्त मान डेटाबेस में संग्रहीत हो जाते हैं

  3. क्या `serverTimezone` परम MySQL में @@session.time_zone बदलता है?

  4. पीडीओ डेटाबेस एक्सेस जहां शीर्षक =$ शीर्षक

  5. MySQL ट्रिगर तालिका को अपडेट नहीं कर सकता - त्रुटि 1442 प्राप्त करना