MySQL 8.4 Release Notes
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 仍然维护这些索引,如下所示:
-
它们将在表修改时更新(
INSERT
、UPDATE
、DELETE
等)。更新操作将像笛卡尔索引一样进行,即使列可能包含笛卡尔和地理值的混合。 -
它们仅用于向后兼容性(例如,能够在 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
索引。
-