5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQL 8.0でSPATIAL INDEXを使用するには列定義でSRIDを指定する必要がある

Last updated at Posted at 2019-07-15

はじめに

下記記事の記事(以降「前記事」)に対する解決策がわかったので書いておく。

「MySQL 8.0でSPATIAL INDEXが使用されない」
https://qiita.com/miyauchi/items/809c82c0e469fd8992ce

結論としては、MySQL8.0でSPATIAL INDEXを使うためには列定義でSRIDを指定しなければならない。SRIDを指定しなかった場合はSPATIAL INDEXは一切使われない。

詳しくは下記の記事で書かれている。

(追記)SPATIAL INDEXが使用されても結局遅くない?っていう記事書きました。
https://qiita.com/miyauchi/items/f6621cc79aff98dd46e0

ogr2ogrを使ってる人への注意点

GDAL3.0.1のogr2ogrで取り込んだ(作成した)テーブルにはSRIDが指定されていないので要注意です。

そもそも前記事を書いたのはogr2ogrで取り込んだデータに対して検索をかけた際に、SPATIAL INDEXが使用されなかったことが発端です。

ogr2ogrを使ってシェープデータをMySQLに取り込んで使用するつもりの人はこの記事で記載するように、列定義にSRIDを後から定義してあげてください。

列定義を修正する

前記事のテーブルは下記でした。

mysql> SHOW CREATE TABLE test;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                           |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `geom` geometry NOT NULL,
  SPATIAL KEY `sp_index` (`geom`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

上記テーブルのgeom列を修正するために、まずはSPATIAL INDEXをDROPする必要がある。

その後、SRIDを指定し、再度SPATIAL INDEXを作成する。

mysql> ALTER TABLE test DROP INDEX sp_index;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE test MODIFY geom GEOMETRY NOT NULL SRID 4326;
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE test ADD SPATIAL INDEX(geom);
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0

SPATIAL INDEXが使われるかどうか確認

無事使われることが確認できました!

mysql> EXPLAIN SELECT ST_AsText(geom) FROM test WHERE ST_Intersects(geom, ST_GeomFromText('POINT(43.06 141.34)', 4326));
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | test  | NULL       | range | geom          | geom | 34      | NULL |    1 |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.04 sec)

まとめ

MySQL8.0でSPATIAL INDEXを使うためには列定義でSRIDを指定しましょう。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?