Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  SPATIAL Index Optimization

10.3.3 SPATIAL Index 优化

MySQL 允许在 NOT NULL 测量值列上创建 SPATIAL 索引(见第13.4.10节,“创建空间索引”)。优化器检查索引列的 SRID 属性,以确定空间参考系统(SRS)用于比较,并使用适当的计算来进行比较。 (在 MySQL 8.4 之前,优化器使用笛卡尔算法对 SPATIAL 索引值进行比较;在包含非笛卡尔 SRIDs 的列中,这些操作的结果是未定义的。)

为了使比较工作正常,每个 SPATIAL 索引列都必须是 SRID-受限的。这意味着列定义必须包含明确的 SRID 属性,并且所有列值都必须具有相同的 SRID。

优化器仅考虑 SRID-受限的 SPATIAL 索引列:

  • 在受限于笛卡尔 SRID 的列上创建的索引可以启用笛卡尔边界框计算。

  • 在受限于地理 SRID 的列上创建的索引可以启用地理边界框计算。

优化器忽略没有 SRID 属性的 SPATIAL 索引列(因此不是 SRID-受限的)。MySQL 仍然维护这些索引,如下所示:

  • 它们将在表修改时更新(INSERTUPDATEDELETE等)。更新操作将像笛卡尔索引一样进行,即使列可能包含笛卡尔和地理值的混合。

  • 它们仅用于向后兼容性(例如,能够在 MySQL 8.2 中进行dump,并在 MySQL 8.3 中恢复)。因为 SPATIAL 索引在非 SRID-受限的列上无用,应将每个列修改:

    • 验证该列中的所有值是否具有相同的 SRID。要确定 geometry 列 col_name 中的 SRIDs,可以使用以下查询:

      SELECT DISTINCT ST_SRID(col_name) FROM tbl_name;

      如果查询返回多行,该列包含多个 SRIDs。在这种情况下,修改其内容,使所有值具有相同的 SRID。

    • 重新定义列,以包含明确的 SRID 属性。

    • 重新创建 SPATIAL 索引。