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