gpt4 book ai didi

mysql - 如何索引此 MySQL 表以用于 GEO 数据?

转载 作者:可可西里 更新时间:2023-11-01 08:21:52 24 4
gpt4 key购买 nike

我的 table 现在是这样的:

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 <derived2> ALL NULL NULL NULL NULL 3
2 DERIVED zch_geodatastore range post_type post_type 70 NULL 3 Using where

不知道这是什么意思...

最佳答案

MySQL 为 MySQL 提供了特殊的 SPATIAL 键。
请参阅:http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html

引自:http://dev.mysql.com/doc/refman/5.1/en/create-index.html

The MyISAM, InnoDB, NDB, and ARCHIVE storage engines support spatial columns such as (POINT and GEOMETRY. (Section 11.17, “Spatial Extensions”, describes the spatial data types.)

空间键是:
•仅适用于MyISAM 表。为其他存储引擎指定 SPATIAL INDEX 会导致错误。
•索引列必须为NOT NULL。
•在MySQL 5.1 中,禁止列前缀长度。每列的全宽都被索引。

你知道这是一个特殊的https://gis.stackexchange.com/此类问题的论坛,
我建议您(加倍)也将您的问题发布到那里。

关于mysql - 如何索引此 MySQL 表以用于 GEO 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5900963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com