sql >> Databáze >  >> RDS >> Mysql

MYSQL pomocí prostorového indexu

To, co vidíte, je, bohužel, obecný problém se způsobem implementace prostorových funkcí v MySQL a související slabina s poddotazy zahrnujícími prostorové funkce.

Aby funkce Contains a Intersects fungovaly správně a aby bylo možné použít index, musíte mít jedna z geometrií konstanta. Zdá se, že to není zdokumentováno, ačkoli všechny příklady, které uvidíte s MySQL s Intersects/Contains, fungují tímto způsobem.

Takže nemůžete napsat něco takového, jako byste mohli v Oracle Spatial nebo Postgis,

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

V takovém dotazu, pokud tabulky a a b mají obě prostorové indexy, budou použity za předpokladu, že je to více omezující než nějaký jiný atribut, který byste mohli vložit do klauzule where.

Totéž platí pro vlastní spojení, kde chcete najít všechny polygony, které se protínají se všemi ostatními polygony v tabulce na základě nějakého atributu, např.

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

V prostoru MySQL jste tedy nuceni mít jednu z geometrií konstantní.

Kromě toho syntaxe levého spojení nedává velký smysl s prostorovým (ačkoli je podporována), protože se ve skutečnosti nepřipojujete na jeden odpovídající atribut, ale na 2rozměrný operátor omezení/průniku.

Také jsem si docela jistý, že na vašem vnitřním spojení se index nepoužívá, když se podíváte na key a rows výstup vysvětlení.




  1. Doplnění chybějících termínů podle skupin

  2. Systémová chyba RMySQL:10060

  3. Jak napsat hql dotaz pro mezi klauzuli pro časové období?

  4. Error:(124, 9) error:metoda nepřepisuje ani neimplementuje metodu z nadtypu