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

MYSQL जियो सर्च में डिस्टेंस परफॉर्मेंस है

ऐसा करने का सबसे तेज़ तरीका MySQL के लिए भू-स्थानिक एक्सटेंशन का उपयोग करना है, जो काफी आसान होना चाहिए क्योंकि आप पहले से ही MyISAM तालिका का उपयोग कर रहे हैं। इन एक्सटेंशन के लिए दस्तावेज़ यहां देखे जा सकते हैं:http:/ /dev.mysql.com/doc/refman/5.6/hi/spatial-extensions.html

POINT डेटाटाइप के साथ एक नया कॉलम जोड़ें:

ALTER TABLE `adverts` 
ADD COLUMN `geopoint` POINT NOT NULL AFTER `longitude`
ADD SPATIAL KEY `geopoint` (`geopoint`)

फिर आप इस कॉलम को अपने मौजूदा अक्षांश और देशांतर क्षेत्रों से भर सकते हैं:

UPDATE `adverts` 
SET `geopoint` = GeomFromText(CONCAT('POINT(',`latitude`,' ',`longitude`,')'));

अगला चरण इनपुट अक्षांश और देशांतर के आधार पर एक बाउंडिंग बॉक्स बनाना है जिसका उपयोग आपके WHERE में किया जाएगा एक CONTAINS के रूप में क्लॉज बाधा आपको X,Y का एक सेट निर्धारित करना होगा POINT वांछित खोज क्षेत्र और दिए गए प्रारंभिक बिंदु के आधार पर आपकी आवश्यकताओं के लिए काम करने वाले निर्देशांक।

आपकी अंतिम क्वेरी सभी POINT . की खोज करेगी डेटा जो आपकी खोज में है POLYGON , और फिर आप अपने डेटा को और परिष्कृत और क्रमबद्ध करने के लिए दूरी गणना का उपयोग कर सकते हैं:

SELECT a.*, 
    ROUND( SQRT( ( ( (adverts.latitude - '53.410778') * (adverts.latitude - '53.410778') ) * 69.1 * 69.1 ) + ( (adverts.longitude - '-2.97784') * (adverts.longitude - '-2.97784') * 53 * 53 ) ), 1 ) AS distance
FROM adverts a
WHERE a.type_id = 3
AND CONTAINS(a.geopoint, GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'))
HAVING distance < 25
ORDER BY distance DESC
LIMIT 0, 30

ध्यान दें कि GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))') उपरोक्त में काम नहीं करेगा , आपको अपने खोज प्रारंभ के आसपास निर्देशांकों को मान्य बिंदुओं से बदलना होगा। यदि आप अक्षांश/लंबे समय के बदलने की अपेक्षा करते हैं, तो आपको POINT रखने के लिए ट्रिगर का उपयोग करने पर विचार करना चाहिए डेटा और संबद्ध SPATIAL KEY आधुनिक। बड़े डेटासेट के साथ आपको HAVING का उपयोग करके प्रत्येक रिकॉर्ड के लिए दूरी की गणना करने और फ़िल्टर करने की तुलना में अत्यधिक बेहतर प्रदर्शन देखना चाहिए खंड। मैंने दूरी निर्धारित करने और बाउंडिंग POLYGON . बनाने में उपयोग के लिए व्यक्तिगत रूप से कार्यों को परिभाषित किया है ।



  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 पूरी तरह से व्यू क्वेरी टेक्स्ट को रिफॉर्मेट क्यों करता है?

  3. MySQL:किसी अन्य तालिका से COUNT के साथ अद्यतन तालिका?

  4. किसी दिए गए स्थान के आस-पास के निकटतम स्थानों को कुशलतापूर्वक कैसे खोजें

  5. mysql प्रश्नों में पिवट करें