OceanBaseデータベースは、SPATIALキーワードを使用して空間インデックスを作成することをサポートしています。テーブル作成時に空間インデックス列は必ず NOT NULL で宣言する必要があります。ストアド(STORED)生成列には空間インデックスを作成できますが、仮想(VIRTUAL)生成列には作成できません。
考慮事項
- スペースインデックスを作成する際のカラム定義には、
NOT NULL制約が含まれている必要があります。 - スペースインデックスを作成したカラムにはすでにSRIDが定義されている必要があります。そうでない場合、そのカラム上の空間インデックスはクエリ時に有効になりません。
- STORED生成列に空間インデックスを作成する場合は、列作成時のDDLで
STOREDキーワードを明示的に指定する必要があります。生成列を作成する際にVIRTUALまたはSTOREDキーワードを指定しない場合、デフォルトでVIRTUAL生成列が作成されます。 - インデックスを作成した後、比較を行う際には列定義内のSRIDに対応する座標系を使用します。空間インデックスは幾何オブジェクトのMBR(Minimum Bounding Rectangle)に基づいて構築され、MBRの比較方法もSRIDに依存します。
準備作業
GIS機能を使用する前に、ビジネステナントにGISメタデータを設定する必要があります。サーバーに接続した後、次のコマンドを実行してdefault_srs_data_mysql.sqlファイルをデータベースにインポートします。
## $passwordは、データベースへのログインパスワードに置き換える必要があります。
## $localhostは、データベースへのログインIPアドレスに置き換える必要があります。
## $tenant_nameは、データベースへのログインテナント名に置き換える必要があります。
## $portは、データベースのポート番号に置き換える必要があります。
$python /home/admin/oceanbase/bin/import_srs_data.py -p'$password' -h $localhost -P $port -t $tenant_name -f /home/admin/oceanbase/etc/default_srs_data_mysql.sql
以下の結果が返された場合は、データファイルのインポートに成功しました。
INFO: succeed to import srs data
INFO: oceanbase.__all_spatial_reference_systems old result rows -- 1
INFO: oceanbase.__all_spatial_reference_systems new result rows -- 5152
例
スペースインデックスの作成
以下の例は、スペースインデックスを作成する方法を示しています。
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);
以下の例は、スペースインデックスを削除する方法を示しています。
ALTER TABLEを使用する:
ALTER TABLE geom DROP INDEX g;
DROP INDEXを使用する:
DROP INDEX g ON geom;
生成された列に空間インデックスを作成する
生成された列とは、データベーステーブルにおける特別な列であり、詳細については生成された列の操作を参照してください。
以下の例は、STORED生成された列に空間インデックスを作成する方法を示しています。
- linestringタイプの生成された列に空間インデックスを作成します。他の
POINT/POLYGON/ | MULTIPOINT/MULTILINESTRING/ | MULTIPOLYGONタイプもサポートされています:
CREATE TABLE `receivable_items` (
`from_unit` int NOT NULL,
`to_unit` int NOT NULL,
`unit_range` linestring GENERATED ALWAYS AS (linestring(point(-(1),`from_unit`), point(1,`to_unit`))) STORED NOT NULL srid 0,
SPATIAL KEY `idx_unit_range` (`unit_range`)
);
- geometryタイプの生成された列に空間インデックスを作成します:
CREATE TABLE `receivable_items` (
`id` int(32) NOT NULL auto_increment,
`geo_text` varchar(1024) NOT NULL,
`unit_range` geometry GENERATED ALWAYS AS (st_geomfromtext(geo_text, 4326, 'axis-order=long-lat')) STORED NOT NULL srid 4326
);
- VIRTUAL生成された列には空間インデックスを作成することはサポートされていません。作成ステートメントはエラーが発生します:
CREATE TABLE `receivable_items` (
`id` int(32) NOT NULL auto_increment,
`geo_text` varchar(1024) NOT NULL,
`unit_range` geometry GENERATED ALWAYS AS (st_geomfromtext(geo_text, 4326, 'axis-order=long-lat')) NOT NULL srid 4326,
SPATIAL KEY `idx_unit_range` (`unit_range`)
);
ERROR 3106 (HY000): 'unit_range' is not supported for generated columns.
- 後でインデックスを作成することをサポートしています:
CREATE TABLE `receivable_items` (
`id` int(32) NOT NULL auto_increment,
`geo_text` varchar(1024) NOT NULL,
`unit_range` geometry GENERATED ALWAYS AS (st_geomfromtext(geo_text, 4326, 'axis-order=long-lat')) STORED NOT NULL srid 4326
);
INSERT INTO receivable_items(geo_text) VALUES('point(120.34904267189361 30.320965261625222)');
INSERT INTO receivable_items(geo_text) VALUES('point(120.34904267189360 30.320965261625222)');
CREATE SPATIAL INDEX IF NOT EXISTS `idx_unit_range` ON `receivable_items` (`unit_range`);
- パーティションテーブルのシナリオをサポートしています:
CREATE TABLE `receivable_items` (
`id` int(32) NOT NULL auto_increment primary key,
`geo_text` varchar(1024) NOT NULL,
`unit_range` geometry GENERATED ALWAYS AS (st_geomfromtext(geo_text, 4326, 'axis-order=long-lat')) STORED NOT NULL srid 4326,
SPATIAL KEY `idx_unit_range` (`unit_range`)
) PARTITION BY hash(id) PARTITIONS 3;