我有一个名为cities
的表:
CREATE TABLE `cities` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`city` varchar(255) DEFAULT NULL,
`state_code` varchar(10) DEFAULT NULL,
`country_code` varchar(10) DEFAULT NULL,
`latitude` double DEFAULT NULL,
`longitude` double DEFAULT NULL,
`geom` geometry NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `country_code` (`country_code`),
SPATIAL KEY `geom` (`geom`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
它包含大约4000行,没有任何行填充state_code
字段。我正在尝试使用另一个名为geodata
的表中的数据填充该字段:
CREATE TABLE `geodata` (
`region_id` bigint(20) NOT NULL AUTO_INCREMENT,
`country_code` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
`state_code` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
`geom` geometry NOT NULL,
PRIMARY KEY (`region_id`),
KEY `country_code` (`country_code`),
KEY `state_code` (`state_code`),
SPATIAL KEY `geom` (`geom`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
该表具有〜1500行,其中包含美国各州和加拿大各省的面数据(某些州有多个条目,因为源数据将其分解为多个几何形状)。
我正在尝试查找最有效的查询,以在所有cities.geom
多边形中查找geodata.geom
点,然后使用来自{{1 }}表。
就像一个测试(选择,而不是更新),我尝试过:
cities.state_code
即使使用此数据子集,查询也需要9秒钟。尝试完全运行它(即没有上面的geodata
子句),我在等待5分钟后放弃了。
我在做什么错?进行SELECT
C.cityid_ppn,
C.city,
C.latitude,
C.longitude,
G.state_code,
G.country_code
FROM cities C
LEFT JOIN geodata G ON (
C.country_code = G.country_code
AND ST_WITHIN(C.geom, G.geom)
)
WHERE
G.country_code='CA'
AND g.state_code='ON'
;
更新的最佳方法是什么?