2013-08-08 11 views
6

To zapytanie powinno dać mi najbliższy element do podanych :x, :y we współrzędnych kartezjańskich.W jaki sposób można zoptymalizować tę kwerendę pod względem szybkości realizacji?

SELECT `type` 
FROM `mapgen_centers` 
ORDER BY SQRT(POW((:x - `x`), 2) + POW((:y - `y`), 2)) 
LIMIT 1 

Obecnie trwa 0.002s średnio co jest w porządku, ale mam wrażenie, to może być lepiej, zwłaszcza dlatego, że obecnie wystrzelić ją bardzo często i często, tak że cała wykonanie pali skryptów do kilku minut.

można (a nawet jeśli, jak) to być optymalizowane poprzez jakichkolwiek środków dostępnych w standardowej instalacji MySQL (procedury, funkcje, indeksy, konfiguracja ...)

+0

możesz rozważyć dodanie kolumny z wynikiem wzoru: 'SQRT (POW ((: x - x), 2) + POW ((: y - y), 2)) 'i dodać indeks na nim – Stephan

+0

Ale': x', ': y' zmienia się przy każdym wykonaniu? Jak utworzyć kolumnę z tą formułą, jeśli wartości nie są wcześniej znane? –

+2

Czy naprawdę potrzebujesz użyć 'SQRT', ponieważ jest on używany tylko do sortowania? Czy nie jest tak, że kiedy (x'-x)^2 + (y'-y)^2 staje się wyższe, jego pierwiastek kwadratowy też jest wyższy? – iCantSeeSharp

Odpowiedz

1

Pomijając usunięcie tego pierwiastka kwadratowego, nie sądzę, aby można to było zrobić lepiej. To, co powinieneś sprawdzić, to to, że czas wykonania jest naprawdę O(n), co musi być, ponieważ musisz przynajmniej przeszukać wszystkie elementy. Można to zrobić, sprawdzając, że czas wykonania zwiększa się liniowo wraz z rozmiarem tabeli w bazie danych. Więc jeśli na tabeli 100000 wierszy zajmuje 10 milisekund, powinno to zająć tylko 100 milisekund na tabeli 1000000 wierszy ...

2

Skoro obliczanie odległości pomiędzy dwoma punktami , Myślę, że możesz użyć MySQL spatial data type W SO jest question, które mogą ci pomóc.

Alternatywnie, jak powiedzieli w komentarzach powyżej, możesz zbudować indeks według wcześniej obliczonej wartości odległości.

3

1.Można użyć MySQL spatial extension.

2.Strip funkcji SQRT, ponieważ nie jest konieczne przy składaniu zamówienia.

+0

Zamiast 1. dlaczego nie obliczyć sumy za każdym razem, gdy X lub Y są aktualizowane? – iCantSeeSharp

+0

@Souvlaki 'x' i' y' muszą być dwiema nazwami kolumn, dlatego nie możemy wstępnie obliczyć. – adamsmith

Powiązane problemy