MySQL 允許在 NOT NULL
幾何值資料行上建立 SPATIAL
索引 (請參閱第 13.4.10 節,「建立空間索引」)。最佳化器會檢查已建立索引之資料行的 SRID
屬性,以判斷要用於比較的空間參考系統 (SRS),並使用適用於 SRS 的計算。(在 MySQL 8.4 之前,最佳化器使用笛卡爾計算來執行 SPATIAL
索引值的比較;如果資料行包含非笛卡爾 SRID 的值,則此類運算的結果將是不確定的。)
為了使比較能夠正常運作,SPATIAL
索引中的每個資料行都必須受 SRID 限制。也就是說,資料行定義必須包含明確的 SRID
屬性,並且所有資料行值都必須具有相同的 SRID。
最佳化器僅考慮受 SRID 限制之資料行的 SPATIAL
索引
對限制為笛卡爾 SRID 的資料行建立索引,可啟用笛卡爾邊界框計算。
對限制為地理 SRID 的資料行建立索引,可啟用地理邊界框計算。
最佳化器會忽略沒有 SRID
屬性 (因此不受 SRID 限制) 的資料行上的 SPATIAL
索引。MySQL 仍然會維護此類索引,如下所示
它們會針對資料表修改進行更新 (
INSERT
、UPDATE
、DELETE
等)。即使資料行可能包含笛卡爾和地理值的混合,更新的發生方式就像索引是笛卡爾索引一樣。它們僅用於向後相容性 (例如,在 MySQL 8.2 中執行傾印並在 MySQL 8.3 中還原的功能)。由於未受 SRID 限制之資料行上的
SPATIAL
索引對最佳化器沒有用處,因此應修改每個此類資料行驗證資料行中的所有值是否具有相同的 SRID。若要判斷幾何資料行
col_name
中包含的 SRID,請使用下列查詢SELECT DISTINCT ST_SRID(col_name) FROM tbl_name;
如果查詢傳回多個資料列,則表示資料行包含多個 SRID。在這種情況下,請修改其內容,使所有值都具有相同的 SRID。
重新定義資料行以具有明確的
SRID
屬性。重新建立
SPATIAL
索引。