2014-07-13 7 views
0

J'ai un grand DB de POI son maintenant environ 150K mais passera à ~ 1 MOptimiser une requête (distance entre 2 coordonnées)

J'ai besoin de retourner tous les points dans un certain rayon d'un point (lat, lon J'ai cette requête qui a bien fonctionné jusqu'à ce que le nombre de lignes augmente. également cette requête utilise cpu environ 60% et essentiellement super lent

SELECT 
    *, 
    (((acos(sin((57.757134*pi()/180)) * 
        sin((coX*pi()/180))+cos((57.757134*pi()/180)) * 
        cos((coX*pi()/180)) * cos(((37.616015- coY)* 
        pi()/180))))*180/pi())*60*1.1515 
        ) as distance 
FROM 
    places_en 
JOIN ( /* these are the query parameters */ 
     SELECT 
      57.757134 AS latpoint, 37.616015 AS longpoint, 
      200 AS radius, 111.045 AS distance_unit) AS p 
WHERE 
    description != '' 
    AND coX BETWEEN p.latpoint - (p.radius/p.distance_unit) 
       AND p.latpoint + (p.radius/p.distance_unit) 
    AND coY BETWEEN p.longpoint - (p.radius/(p.distance_unit * COS(RADIANS(p.latpoint)))) 
       AND p.longpoint + (p.radius/(p.distance_unit * COS(RADIANS(p.latpoint)))) 
HAVING 
    distance <= 200 
ORDER BY 
    distance; 

Comment puis-je faire mieux?

Merci

+1

Vous devriez regarder dans une solution SIG. Voici un point de départ: http://dev.mysql.com/doc/refman/5.7/fr/spatial-extensions.html. –

Répondre

0

bien si quelqu'un va venir dans c'est ici l'avant-corps:

j'ai mis en place une colonne « Geopoint » Comme type POINT.

SELECT 
      *, 
      (GLength(
      LineStringFromWKB(
       LineString(
       geoPoint, 
       GeomFromText('POINT(".$lat." ".$lon.")') 
      ) 
      ) 
      )) 
      AS distance 
      FROM TABLE_NAME 
      HAVING distance <= ".$radius." 
      ORDER BY distance 
Questions connexes