在MySQL中运行重复的复杂空间查询时性能下降

时间:2017-01-04 03:51:54

标签: mysql spatial

我正在搜索按距离选择的圆圈。我有一点与纬度和&经度和我想搜索我在数据库中的一些点我周围。是的,它必须是一个圆圈!

我在查询中使用此子句(我只是谷歌,我不能做数学):

((6373 * acos (cos ( radians( 48.568962 ) ) * cos( radians( X(coords) ) ) * cos( radians( Y(coords) ) - radians( 6.821352 ) ) + sin ( radians( 48.568962 ) ) * sin( radians( X(coords) ) )))  <='0.2')

0.2 = 200米

  1. 我使用POINT数据类型
  2. 是的,我有空间索引
  3. 是的,我试图使用&#34;空间&#34;功能,但它没有返回一个圆圈,它返回一些OVAL,我需要精确的圆圈
  4. 这个&#34;圈&#34;对于所有表,子句需要非常非常长的时间。当我使用SPATIAL foos的OVAL方法时。这可能需要0.1秒,这太棒了!但我需要圈,这需要17秒,大声笑。

    你能帮我一个人吗?非常感谢!

    编辑:空间功能意味着像这样:

    WHERE ST_Contains(ST_Buffer(
          ST_GeomFromText('POINT(12.3456 34.5678)'), (0.00001*1000)) , coords) <= 1 /* 1 km */
    

    EDIT 2(表格结构):

    enter image description here enter image description here

    我希望这些表中有10行,当然我在wz_uuid上有索引

    select a....., b.... from table_1 a left join table_2 b on a.wz_uuid=b.wz_uuid
    

    这不仅仅是2个表,我有11个表* 2这样。 (每周数据库备份)。第一个表(_1)有0-4000行,2-11有300k +行。

    所有索引都是相关的,也是数据类型和编码。

    wz_uuid & id - unique, btree index
    others - btree indexes
    coords - spatial index
    

1 个答案:

答案 0 :(得分:0)

从XX秒到100毫秒的绝佳解决方案,这就是我想要的: - )

Use MySQL spatial extensions to select points inside circle