MySQL 允许在 NOT NULL
几何值列上创建 SPATIAL
索引(请参阅 第 13.4.10 节“创建空间索引”)。优化器会检查索引列的 SRID
属性,以确定要用于比较的空间参考系统 (SRS),并使用适合该 SRS 的计算。(在 MySQL 8.4 之前,优化器使用笛卡尔计算来执行 SPATIAL
索引值的比较;如果该列包含具有非笛卡尔 SRID 的值,则此类操作的结果未定义。)
为了使比较正常工作,SPATIAL
索引中的每一列都必须受 SRID 限制。也就是说,列定义必须包含显式 SRID
属性,并且所有列值必须具有相同的 SRID。
优化器仅针对受 SRID 限制的列考虑 SPATIAL
索引
对受限于笛卡尔 SRID 的列上的索引启用笛卡尔边界框计算。
对受限于地理 SRID 的列上的索引启用地理边界框计算。
优化器会忽略没有 SRID
属性(因此不受 SRID 限制)的列上的 SPATIAL
索引。MySQL 仍然维护此类索引,如下所示
它们会针对表修改进行更新(
INSERT
、UPDATE
、DELETE
等)。更新的发生方式就好像索引是笛卡尔坐标系一样,即使该列可能包含笛卡尔坐标系和地理坐标系值的混合。它们的存在只是为了向后兼容(例如,能够在 MySQL 8.2 中执行转储并在 MySQL 8.3 中恢复)。因为不受 SRID 限制的列上的
SPATIAL
索引对优化器没有用处,所以应该修改每个此类列验证列中的所有值是否具有相同的 SRID。要确定几何列
col_name
中包含的 SRID,请使用以下查询SELECT DISTINCT ST_SRID(col_name) FROM tbl_name;
如果查询返回多行,则该列包含 SRID 的混合。在这种情况下,请修改其内容,以便所有值都具有相同的 SRID。
重新定义该列,使其具有显式
SRID
属性。重新创建
SPATIAL
索引。