mysql geo支持,如何索引此MySQL表以与GEO数据一起使用?

我的桌子目前是这样的:

CREATE TABLE IF NOT EXISTS `x_geodata` (

`post_id` int(11) NOT NULL,

`post_type` varchar(20) NOT NULL,

`lat` float(10,6) NOT NULL,

`lng` float(10,6) NOT NULL,

PRIMARY KEY (`post_id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

如何正确,有效地索引此表?

在此表上运行的唯一查询如下:

if(!empty($_SESSION['s_property_radius'])) {$dist = $_SESSION['s_property_radius'];}else{$dist = 50;}

$orig_lat = $_SESSION['s_property_address_lat'];

$orig_lon = $_SESSION['s_property_address_lng'];

$lon1 = $orig_lon - $dist / abs( cos( deg2rad( $orig_lat ) ) * 69 );

$lon2 = $orig_lon + $dist / abs( cos( deg2rad( $orig_lat ) ) * 69 );

$lat1 = $orig_lat - ( $dist / 69 );

$lat2 = $orig_lat + ( $dist / 69 );

$sql = "

SELECT `t`.`post_id`, 3956 * 2 * ASIN( SQRT( POWER( SIN( ( ".$orig_lat." - `t`.`lat` ) * pi() / 180 / 2), 2 ) + COS( ".$orig_lat." * pi() / 180) * COS( `t`.`lat` * pi() / 180 ) * POWER( SIN( ( ".$orig_lon." - `t`.`lng` ) * pi() / 180 / 2 ), 2 ) ) ) AS `distance` FROM (

SELECT `post_id`, `lat`, `lng` FROM `x_geodata` WHERE `post_type` = 'some post type' AND `lng` BETWEEN '".$lon1."' AND '".$lon2."' AND `lat` BETWEEN '".$lat1."' AND '".$lat2."'

) AS `t` HAVING `distance` <= ".$dist."

";

该查询将检查以确保我们正在查看正确的帖子类型,然后在经纬度上进行平方半径检查.然后,将通过圆形半径检查运行返回的结果.

我正在寻找的是更新的CREATE TABLE SQL或UPDATE TABLE SQL,以正确获取此INDEXED.

任何帮助是极大的赞赏.

编辑:

在基于arnep答案的查询中做了一个解释,我得到了:

id select_type table type possible_keys key key_len ref rows Extra

1 PRIMARY ALL NULL NULL NULL NULL 3

2 DERIVED zch_geodatastore range post_type post_type 70 NULL 3 Using where

不知道那是什么意思…

解决方法:

当您的内部SELECT在WHERE子句中使用post_type,lat和lon时,我建议在这些索引上放置一个索引.

使用EXPLAIN [QUERY]来查看索引是否被使用以及从索引中获得什么好处.

标签:geolocation,latitude-longitude,mysql

来源: https://codeday.me/bug/20191208/2091514.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值