Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL usando l'indice spaziale

Quello che vedi è, sfortunatamente, un problema generale con il modo in cui le funzioni spaziali sono implementate in MySQL e una relativa debolezza con le sottoquery che coinvolgono funzioni spaziali.

Per il corretto funzionamento delle funzioni Contiene e Interseca e per l'utilizzo dell'indice, è necessario che una delle geometrie sia una costante. Questo non sembra essere documentato, anche se tutti gli esempi che vedrai con MySQL con Intersects/Contains funzionano in questo modo.

Quindi, non puoi scrivere qualcosa del genere, come potresti in Oracle Spatial o Postgis,

select a.*, b.* 
from sometable a, someothertable b 
where ST_Intersects(a.geom, b.geom) 
and a.someattribute=... and b.someattribute=...;

In una tale query, se le tabelle aeb hanno entrambe indici spaziali, verranno utilizzate, a condizione che ciò sia più restrittivo di qualche altro attributo che potresti inserire nella clausola where.

Lo stesso vale per gli auto join, dove vuoi trovare tutti i poligoni che si intersecano con tutti gli altri poligoni in una tabella in base a qualche attributo, ad esempio,

select a.* 
from sometable a, sometable b 
where ST_Intersects(a.geom, b.geom) ....

Quindi, in MySQL spaziale sei costretto a fare in modo che una delle geometrie sia una costante.

Per inciso, la sintassi del join sinistro non ha molto senso con spaziale (sebbene sia supportata), poiché non ti stai davvero unendo su un singolo attributo abbinato, ma su un operatore di contenimento/intersezione bidimensionale.

Inoltre, sono abbastanza sicuro che nel tuo inner join l'indice non venga utilizzato, se guardi la key e rows output di spiegare.