To, co widzisz, to niestety ogólny problem ze sposobem implementacji funkcji przestrzennych w MySQL i powiązana słabość z podzapytaniami dotyczącymi funkcji przestrzennych.
Aby funkcje Zawiera i Przecięcia działały poprawnie i aby można było używać indeksu, jedna z geometrii musi być stała. Wydaje się, że nie jest to udokumentowane, chociaż wszystkie przykłady, które zobaczysz w MySQL z przecięciami/zawierającymi, działają w ten sposób.
Więc nie możesz napisać czegoś takiego, jak w Oracle Spatial lub Postgis,
select a.*, b.*
from sometable a, someothertable b
where ST_Intersects(a.geom, b.geom)
and a.someattribute=... and b.someattribute=...;
W takim zapytaniu, jeśli obie tabele a i b mają indeksy przestrzenne, zostaną użyte, pod warunkiem, że jest to bardziej restrykcyjne niż jakiś inny atrybut, który możesz umieścić w klauzuli where.
To samo dotyczy złączeń siebie, gdzie chcesz znaleźć wszystkie wielokąty, które przecinają się ze wszystkimi innymi wielokątami w tabeli na podstawie jakiegoś atrybutu, np.
select a.*
from sometable a, sometable b
where ST_Intersects(a.geom, b.geom) ....
Tak więc w przestrzennym MySQL musisz mieć jedną z geometrii jako stałą.
Na marginesie, składnia lewego złączenia nie ma większego sensu w przypadku przestrzennego (chociaż jest obsługiwana), ponieważ tak naprawdę nie łączysz się na podstawie pojedynczego dopasowanego atrybutu, ale na dwuwymiarowym operatorze zawierania/przecięcia.
Ponadto jestem prawie pewien, że na twoim wewnętrznym sprzężeniu indeks nie jest używany, jeśli spojrzysz na key
i rows
wyjście wyjaśnienia.