发现问题
表结构如下,boundary字段建立空间索引
CREATE TABLE `area` (`id` int(11) NOT NULL COMMENT '行政区划编码',`pid` int(11) NOT NULL COMMENT '上级编码',`deep` int(11) NOT NULL COMMENT '深度',`name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称',`boundary` geometry NOT NULL COMMENT '边界-GCJ02',PRIMARY KEY (`id`) USING BTREE,SPATIAL INDEX `Index_boundary`(`boundary`)
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '行政区域信息';
以下SQL用来查询经纬度所属的行政区域
SELECT id FROM area WHERE ST_CONTAINS (boundary,POINT(108.22,34.55)) AND deep = 2;
将数据库MySQL版本由5.7升级至8.0.36后,查询时间由3毫秒变成500毫秒,分析SQL发现没有用到Index_boundary索引
而在5.7版本同样的表结构和索引
解决办法
- 删除原来的索引
ALTER TABLE `area` DROP INDEX `Index_boundary`;
- 修改字段设置SRID属性
-- MySQL8
ALTER TABLE `area` CHANGE COLUMN `boundary` `boundary` geometry SRID 0 NOT NULL COMMENT '边界-GCJ02';
- 重新建立索引
ALTER TABLE `area` ADD SPATIAL INDEX `index_boundary`(`boundary`);
参考
https://zhuanlan.zhihu.com/p/371270802