Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于坐标距离的mySQL空间选择加速_Mysql_Spatial - Fatal编程技术网

基于坐标距离的mySQL空间选择加速

基于坐标距离的mySQL空间选择加速,mysql,spatial,Mysql,Spatial,我正在尝试将我们的场地从使用Lat/Lng场地(CHAR)移到远处。我们目前就是这样做的: SELECT ID,( 6371 * acos( cos( radians(52.35462) ) * cos( radians( glinks_Links.Latitude ) ) * cos( radians( glinks_Links.Longitude ) - radians(4.88227) ) + sin( radians(52.35462) ) * sin( radians( glinks_

我正在尝试将我们的场地从使用Lat/Lng场地(CHAR)移到远处。我们目前就是这样做的:

SELECT ID,( 6371 * acos( cos( radians(52.35462) ) * cos( radians( glinks_Links.Latitude ) ) * cos( radians( glinks_Links.Longitude ) - radians(4.88227) ) + sin( radians(52.35462) ) * sin( radians( glinks_Links.Latitude ) ) ) ) AS distance FROM glinks_Links
WHERE
    (
    ((Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)) )
    AND
    (Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5))
    )
HAVING distance < 40 ORDER BY distance
然后是另一个实际给出“距离”的版本(我们想按此排序,只包括最近的距离)

那么什么似乎是最好的:

SELECT * 
FROM glinks_Links
where st_distance_sphere(POINT(4.88227,52.35462), point_test)/1000 <= 100
选择*
来自glinks\u链接

当st_距离_球面(点(4.88227,52.35462),点_测试)/1000时,确保你有适当的综合指数

 create index  my_idx ON  glinks_Links (Latitude, Longitude, ID)
对于where条件,您不需要使用unuseful()(使用And)


谢谢,但我不想再问这个问题:)我们现在转到空间字段(点测试列,这是一个点)。我的第三个查询很快,但我没有办法根据最小距离对其排序(首先)谢谢,但是
表glinks\u Links列(纬度、经度、点测试、ID)
给了我一个错误<代码>在第1行的“table glinks_Links columns(纬度、经度、点测试、ID)”附近有一个错误
为了获得更好的性能,您需要复合冗余索引(在where和in select中包含列的索引仅用于索引信息并避免表访问)。答案更新为正确的创建索引到TAX tooThanks-它到达了那里。我会接受的,但是明天我还要玩一点。我相信我可以从中挤出更多的速度(移动到SPATAIL场的全部目的是尝试让它至少快50%,但现在只快了一点点)
Showing rows 0 - 99 (100 total, Query took 0.0237 seconds.)
SELECT * 
FROM glinks_Links
where st_distance_sphere(POINT(4.88227,52.35462), point_test)/1000 <= 100
 create index  my_idx ON  glinks_Links (Latitude, Longitude, ID)
SELECT ID,( 6371 * acos( cos( radians(52.35462) ) * cos( radians( glinks_Links.Latitude ) ) 
    * cos( radians( glinks_Links.Longitude ) - radians(4.88227) ) + sin( radians(52.35462) ) 
    * sin( radians( glinks_Links.Latitude ) ) ) ) AS distance 
FROM glinks_Links
WHERE Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)
AND Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5)
HAVING distance < 40 
ORDER BY distance
  SELECT ID, st_distance_sphere(POINT(4.88227,52.35462), point_test) / 1000 AS distance 
  FROM glinks_Links 
  WHERE Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)
  AND  Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5)
  HAVING DISTANCE < 100 
  ORDER BY distance 
  LIMIT 100 
 create index  myidx ON glinks_Links (Latitude, Longitude, point_test, ID )