加快MySQL空间查询(多边形中的点查找)

加快MySQL空间查询(多边形中的点查找),mysql,spatial-index,Mysql,Spatial Index,我有一张名为“城市”的表格: 创建“城市”表( `id`bigint(20)非空自动增量, `city`varchar(255)默认为空, `状态代码'varchar(10)默认为空, `国家/地区代码'varchar(10)默认为空, `纬度`双默认值为空, `经度`双默认值NULL, `geom`几何体不为空, 使用BTREE的主键(`id`), 键“国家/地区代码”(“国家/地区代码”), 空间键'geom'('geom`) )ENGINE=InnoDB默认字符集=utf8; 它包含大约

我有一张名为“城市”的表格:

创建“城市”表(
`id`bigint(20)非空自动增量,
`city`varchar(255)默认为空,
`状态代码'varchar(10)默认为空,
`国家/地区代码'varchar(10)默认为空,
`纬度`双默认值为空,
`经度`双默认值NULL,
`geom`几何体不为空,
使用BTREE的主键(`id`),
键“国家/地区代码”(“国家/地区代码”),
空间键'geom'('geom`)
)ENGINE=InnoDB默认字符集=utf8;
它包含大约4000行,其中没有一行填充了
state\u code
字段。我试图使用另一个名为
geodata
的表中的数据填充该字段:

创建表“地理数据”(
`区域id`bigint(20)非空自动增量,
`国家/地区代码'varchar(10)字符集utf8对比utf8\u常规\u ci非空默认值',
`状态代码'varchar(10)字符集utf8比较utf8\u常规\u ci非空默认值',
`geom`几何体不为空,
主键(`region\u id`),
键“国家/地区代码”(“国家/地区代码”),
键“状态代码”(“状态代码”),
空间键'geom'('geom`)
)ENGINE=InnoDB默认字符集=utf8;
该表有约1500行,其中包含美国各州和加拿大各省的多边形数据(有些州有多个条目,因为源数据将其分解为多个几何体)

我正试图找到最有效的查询,以便在所有
geodata.geom
多边形中查找
cities.geom
点,然后使用
geodata
表中的适当数据更新
cities.state\u code

作为测试(选择,而不是更新),我尝试了以下方法:

选择
C.cityid_ppn,
C.城市,
C.纬度,
C.经度,
G.州代码,
G.国家/地区代码
来自C城市
左连接地理数据G ON(
C.国家代码=G.国家代码
和内部的ST_(C.geom,G.geom)
)
哪里
G.国家/地区代码='CA'
和g.state_code='ON'
;
即使使用此数据子集,查询也需要9秒。尝试在全套上运行它(即没有上面的
WHERE…
子句),我在等待了5分钟后放弃了


我做错了什么?更新城市的最佳方法是什么?

您可以尝试将城市几何图形数据类型从几何图形更改为点。如果city.geom不是点而是城市边界,则使用lon/lan。此外,我认为您应该更改城市-州和国家代码数据类型,以便将它们与地区(字符集/对比)相匹配。不幸的是,我不知道这是否真的有助于加快您的查询。谢谢!我尝试将
cities.geom
更改为POINT,甚至将
geodata.geom
更改为POLYGON,这似乎根本不会影响查询速度。此外,更改代码列上的字符集/排序以匹配也没有帮助。可能您已经看到了这一点(看起来像您的案例):您可以尝试将城市几何图形数据类型从几何图形更改为点。如果city.geom不是点而是城市边界,则使用lon/lan。此外,我认为您应该更改城市-州和国家代码数据类型,以便将它们与地区(字符集/对比)相匹配。不幸的是,我不知道这是否真的有助于加快您的查询。谢谢!我尝试将
cities.geom
更改为POINT,甚至将
geodata.geom
更改为POLYGON,这似乎根本不会影响查询速度。此外,将代码列上的字符集/排序更改为匹配也没有帮助。可能您已经看到了这一点(看起来像您的案例):