Hej, posiadam tabelę o następującej strukturze:
CREATE TABLE `my_table` (
`id` int NOT NULL AUTO_INCREMENT,
`shape` geometry NOT NULL,
`bounds` geometry NOT NULL, -- Polygon o czterech wierzchołkach
PRIMARY KEY (`id`),
SPATIAL KEY `bounds_idx` (`bounds`)
) ENGINE=InnoDB AUTO_INCREMENT=13748 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
Tabela ma około 14 tys. wierszy i zawiera informacje o pewnych geometriach. Szukam sposobu na optymalizację zapytania znajdującego wszystkie geometrie w tabeli, których obwiednia (kolumna bounds) przecina się z kołem o zdefiniowanym promieniu R (wyrażonym w m) i środku w pewnym punkcie referencyjnym P (latitude, longitude).
Na ten moment moje zapytanie wygląda następująco (dzielenie przez 111194.927 wynika z konwersji na współrzędne geograficzne):
SELECT ST_Intersects(ST_Buffer(P, R / 111194.927), bounds) AS i from my_table
Dla przykładowych danych:
P = ST_GeomFromText('POINT(53 21)')
R = 30000
zapytanie wygląda następująco:
SELECT ST_Intersects(ST_Buffer(ST_GeomFromText('POINT(53 21)'), 30000 / 111194.927), bounds) AS i from my_table
Powyższe zapytanie nie zajmuje więcej niż ~3ms, natomiast poniższe zapytanie, gdzie wybierane są tylko geometrie których obwiednie przecinają się ze wspomnianym kołem (i = 1), wykonuje się średnio ~70ms. Czasy są tym większe im mniej obwiedni przecina się z kołem.
SELECT ST_Intersects(ST_Buffer(ST_GeomFromText('POINT(53 21)'), 30000 / 111194.927), bounds) AS i from my_table HAVING i = 1
Zdaję sobie sprawę, że czasy 70ms wydają się być w pełni akceptowalne, jednak ze względu na to że wszystkie punkty znalezionych geometrii są później dodatkowo przetwarzane (PHP) to zależy mi na każdej milisekundzie.
Czy podane przeze mnie zapytanie może być w jakikolwiek sposób zoptymalizowane?