MySQL では、NOT NULL
ジオメトリ値カラムに SPATIAL
インデックスを作成できます (セクション11.4.10「空間インデックスの作成」 を参照)。 オプティマイザは、インデックス付けされたカラムの SRID
属性をチェックして、比較に使用する空間参照システム (SRS) を決定し、SRS に適した計算を使用します。 (MySQL 8.0 より前では、オプティマイザはデカルト計算を使用して SPATIAL
インデックス値の比較を実行します。このような操作の結果は、非デカルト SRID を持つ値がカラムに含まれている場合は未定義です。)
比較が適切に機能するには、SPATIAL
インデックスの各カラムが SRID 制限付きである必要があります。 つまり、カラム定義には明示的な SRID
属性が含まれている必要があり、すべてのカラム値は同じ SRID を持つ必要があります。
オプティマイザは、SRID で制限されたカラムに対してのみ SPATIAL
インデックスを考慮します:
デカルト SRID に制限されたカラムのインデックスを使用すると、デカルト境界ボックスの計算が可能になります。
地理 SRID に制限されたカラムのインデックスを使用すると、地理的境界ボックスの計算が可能になります。
オプティマイザは、SRID
属性を持たない (したがって SRID 制限のない) カラムの SPATIAL
インデックスを無視します。 MySQL では、このようなインデックスは次のように維持されます:
テーブルの変更 (
INSERT
,UPDATE
,DELETE
など) のために更新されます。 カラムにデカルト値と地理的値が混在している場合でも、インデックスがデカルトであるかのように更新が行われます。-
これらは下位互換性のためにのみ存在します (たとえば、MySQL 5.7 でダンプを実行し、MySQL 8.0 でリストアする機能)。 SRID 制限のないカラムの
SPATIAL
インデックスはオプティマイザで使用されないため、このような各カラムを変更する必要があります:-
カラム内のすべての値が同じ SRID を持つことを確認します。 ジオメトリカラム
col_name
に含まれる SRID を確認するには、次のクエリーを使用します:SELECT DISTINCT ST_SRID(col_name) FROM tbl_name;
クエリーで複数の行が返された場合、カラムには SRID の混在が含まれます。 その場合は、その内容を変更して、すべての値が同じ SRID を持つようにします。
明示的な
SRID
属性を持つようにカラムを再定義します。SPATIAL
インデックスを再作成します。
-