Sayangnya, apa yang Anda lihat adalah masalah umum dengan cara fungsi spasial diimplementasikan di MySQL dan kelemahan terkait dengan subkueri yang melibatkan fungsi spasial.
Agar fungsi Berisi dan Berpotongan berfungsi dengan baik, dan agar indeks dapat digunakan, Anda harus memiliki salah satu geometri berupa konstanta. Ini tampaknya tidak didokumentasikan, meskipun semua contoh yang akan Anda lihat dengan MySQL dengan Intersects/Contains bekerja dengan cara ini.
Jadi, Anda tidak dapat menulis sesuatu seperti ini, seperti yang Anda lakukan di Oracle Spatial atau Postgis,
select a.*, b.*
from sometable a, someothertable b
where ST_Intersects(a.geom, b.geom)
and a.someattribute=... and b.someattribute=...;
Dalam kueri seperti itu, jika tabel a dan b keduanya memiliki indeks spasial, mereka akan digunakan, asalkan ini lebih membatasi daripada beberapa atribut lain yang mungkin Anda masukkan ke dalam klausa where.
Hal yang sama berlaku untuk self join, di mana Anda ingin menemukan semua poligon yang berpotongan dengan semua poligon lain dalam tabel berdasarkan beberapa atribut, misalnya,
select a.*
from sometable a, sometable b
where ST_Intersects(a.geom, b.geom) ....
Jadi, dalam spasial MySQL Anda dipaksa untuk memiliki salah satu geometri menjadi konstanta.
Selain itu, sintaks gabungan kiri tidak masuk akal dengan spasial (meskipun didukung), karena Anda tidak benar-benar bergabung pada satu atribut yang cocok, tetapi pada operator penahanan/persimpangan 2 dimensi.
Juga, saya cukup yakin bahwa di dalam Anda bergabung, indeks tidak digunakan, jika Anda melihat key
dan rows
keluaran dari penjelasan.