Documentation Home
MySQL 8.0 参考手册  / 第8章优化  / 8.3 优化和索引  /  8.3.3 空间索引优化

8.3.3 空间索引优化

MySQL 允许SPATIALNOT NULL几何值列上创建索引(请参阅 第 11.4.10 节,“创建空间索引”)。优化器检查SRID索引列的属性以确定要使用哪个空间参考系统 (SRS) 进行比较,并使用适合 SRS 的计算。(在 MySQL 8.0 之前,优化器SPATIAL使用笛卡尔计算对索引值进行比较;如果列包含具有非笛卡尔 SRID 的值,则此类操作的结果是未定义的。)

为使比较正常进行, SPATIAL索引中的每一列都必须受 SRID 限制。也就是说,列定义必须包含显式 SRID属性,并且所有列值必须具有相同的 SRID。

优化器SPATIAL只考虑 SRID 限制列的索引:

  • 限制为笛卡尔 SRID 的列上的索引启用笛卡尔边界框计算。

  • 限制为地理 SRID 的列上的索引支持地理边界框计算。

优化器忽略SPATIAL没有SRID属性(因此不受 SRID 限制)的列上的索引。MySQL仍然维护着这样的索引,如下:

  • 它们会针对表格修改进行更新(INSERTUPDATEDELETE等等)。更新就像索引是笛卡尔坐标一样发生,即使该列可能包含笛卡尔坐标值和地理值的混合。

  • 它们的存在只是为了向后兼容(例如,能够在 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索引。