InnoDB
および MyISAM
テーブルの場合、MySQL では、通常のインデックスを作成する場合と同様の構文を使用して空間インデックスを作成できますが、SPATIAL
キーワードを使用します。 空間インデックスのカラムは、NOT NULL
と宣言する必要があります。 次の各例では空間インデックスの作成方法を示します。
-
CREATE TABLE
を使用する場合:CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326, SPATIAL INDEX(g));
-
ALTER TABLE
を使用する場合:CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326); ALTER TABLE geom ADD SPATIAL INDEX(g);
-
CREATE INDEX
を使用する場合:CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326); CREATE SPATIAL INDEX g ON geom (g);
SPATIAL INDEX
は R ツリーインデックスを作成します。 空間カラムの非空間インデックスをサポートするストレージエンジンでは、B ツリーインデックスが作成されます。 空間値に対する B ツリーインデックスは、正確な値の検索に役立ちますが、範囲スキャンには役立ちません。
オプティマイザは、SRID 制限のあるカラムに定義された空間インデックスを使用できます。 詳細は、セクション11.4.1「空間データ型」およびセクション8.3.3「SPATIAL インデックス最適化」を参照してください。
空間カラムのインデックス作成の詳細については、セクション13.1.15「CREATE INDEX ステートメント」を参照してください。
空間インデックスを削除するには、次のように ALTER TABLE
または DROP INDEX
を使用します。
-
ALTER TABLE
を使用する場合:ALTER TABLE geom DROP INDEX g;
-
DROP INDEX
を使用する場合:DROP INDEX g ON geom;
例: テーブル geom
に 32,000 件を超えるジオメトリが含まれていて、それらの図形が型 GEOMETRY
のカラム g
に格納されているものとします。 またこのテーブルには、オブジェクト ID の値を格納するための AUTO_INCREMENT
カラム fid
も含まれています。
mysql> DESCRIBE geom;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| fid | int(11) | | PRI | NULL | auto_increment |
| g | geometry | | | | |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> SELECT COUNT(*) FROM geom;
+----------+
| count(*) |
+----------+
| 32376 |
+----------+
1 row in set (0.00 sec)
カラム g
に空間インデックスを追加するには、次のステートメントを使用します。
mysql> ALTER TABLE geom ADD SPATIAL INDEX(g);
Query OK, 32376 rows affected (4.05 sec)
Records: 32376 Duplicates: 0 Warnings: 0