はじめに
下記記事の記事(以降「前記事」)に対する解決策がわかったので書いておく。
「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を指定しましょう。