残念ながら、あなたが目にしているのは、MySQLでの空間関数の実装方法に関する一般的な問題と、空間関数を含むサブクエリに関連する弱点です。
包含関数と交差関数が正しく機能し、インデックスが使用されるためには、ジオメトリの1つが定数である必要があります。 これは文書化されていないようですが、MySQL with Intersects/Containsで表示されるすべての例はこのように機能します。
したがって、Oracle SpatialやPostgisのように、このようなものを書くことはできません。
select a.*, b.*
from sometable a, someothertable b
where ST_Intersects(a.geom, b.geom)
and a.someattribute=... and b.someattribute=...;
このようなクエリでは、テーブルaとbの両方に空間インデックスがある場合、where句に設定する他の属性よりも制限が厳しい場合は、それらが使用されます。
同じことが自己結合にも当てはまります。この場合、テーブル内の他のすべてのポリゴンと交差するすべてのポリゴンを、たとえば
などの属性に基づいて検索します。select a.*
from sometable a, sometable b
where ST_Intersects(a.geom, b.geom) ....
したがって、MySQL空間では、ジオメトリの1つを定数にする必要があります。
余談ですが、左結合構文は、(サポートされていますが)空間ではあまり意味がありません。これは、一致する単一の属性ではなく、2次元の包含/交差演算子で結合するためです。
また、key
を見ると、内部結合でインデックスが使用されていないことは間違いありません。 およびrows
Explainの出力。