MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  SPATIAL インデックス最適化

8.3.3 SPATIAL インデックス最適化

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 インデックスを再作成します。


関連キーワード:  インデックス, テーブル, カラム, InnoDB, SPATIAL, SRID, クエリー, 制限, ステートメント, 結合