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