MySQL 允許在 NOT NULL
幾何值資料行上建立 SPATIAL
索引 (請參閱第 13.4.10 節,「建立空間索引」)。最佳化工具會檢查索引資料行的 SRID
屬性,以判斷要用於比較的空間參考系統 (SRS),並使用適合 SRS 的計算。(在 MySQL 9.0 之前,最佳化工具使用笛卡爾計算執行 SPATIAL
索引值的比較;如果資料行包含非笛卡爾 SRID 的值,則此類作業的結果未定義。)
為了使比較正常運作,SPATIAL
索引中的每個資料行都必須是 SRID 受限的。也就是說,資料行定義必須包含明確的 SRID
屬性,並且所有資料行值都必須具有相同的 SRID。
最佳化工具僅會考慮 SRID 受限資料行的 SPATIAL
索引
受限於笛卡爾 SRID 的資料行上的索引可啟用笛卡爾邊界方塊計算。
受限於地理 SRID 的資料行上的索引可啟用地理邊界方塊計算。
最佳化工具會忽略沒有 SRID
屬性 (因此不是 SRID 受限) 之資料行上的 SPATIAL
索引。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
索引。