Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MYSQL przy użyciu indeksu przestrzennego

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zaktualizować wiele wierszy za pomocą jednego zapytania?

  2. Złap zduplikowany wpis Wyjątek

  3. Zend Framework i Mysql - bardzo wolne

  4. MySql :Wybierz instrukcję za pomocą operatora IN

  5. Dodawanie wierszy do mysql z dynamicznych pól formularza jquery