Opcje:
-
Włącz sortowanie do definicji/logiki procedury składowanej. Jeśli wywołujący kod SQL wybierz w ramach procedury składowanej, wykonaj tam sortowanie i ograniczanie . — Oznacza to, że w procedurze składowanej nie będzie produkowanych 10 000 wierszy, tylko po to, aby je odwoływać. Ponadto, jeśli tabela ma indeksy, oryginalne sortowanie w ramach wyboru SQL może być znacznie szybsze.
-
Sprawdź, czy w Twojej tabeli jest używane indeksowanie. - Indeksy spowodują szybsze sortowanie podczas wybierania w tabeli.
Podaj nam definicję funkcji, łatwiej byłoby Ci dodatkowo pomóc.
Na koniec spróbuj przenieść zamówienie i ograniczyć je bezpośrednio w swojej funkcji, zamiast robić to później. Twoja funkcja może zwrócić 10 wyników bezpośrednio posortowanych i gotowych. Jeśli chcesz, utwórz dwie funkcje - jedną, która zwraca pełne wyniki, a drugą, która zwraca je ograniczone i posortowane.
Aktualizacja:
Po obejrzeniu swojej funkcji staje się jasne, że próbujesz uporządkować według obliczonej wartości. Porządkowanie według obliczonych wartości jest bardzo powolne, jak również wspomniano w:
- https://stackoverflow.com/a/3401611/1688441
- MySQL-Performance przy zamawianiu na kolumnie obliczeniowej
Zastanawiam się, jak można „wstępnie przetworzyć/zamówić” swoje dane w oparciu o col1 lub col2, aby przyspieszyć ostateczne uporządkowanie wyników. Jeśli col1 i col2 są kolumnami tabeli, a funResult jest funkcją matematyczną, którą można przedstawić na wykresie, jeden z nich ma większy wpływ na wartość zwracaną przez funkcję....
Na koniec, jeśli col1 i col2 są kolumnami myTable, nie musisz używać przechowywanej funkcji, ale możesz wykonywać zapytania, ale nie miałoby to dużej różnicy... Twoim głównym problemem jest porządkowanie według obliczonej funkcji:
SELECT rowId, ((col1-INPUT_CONST)*2)+(col2*3) AS funResult
FROM myTable
ORDER BY funResult DESC
LIMIT 10
Aktualizacja 2:
Po wykopaniu problemu z sortowaniem obliczonej odległości stwierdziłem, że zostało to poproszone i rozwiązane w bardzo sprawny sposób pod poniższym linkiem. W odniesieniu do sortowania według obliczonej wartości, ponieważ sortowanie według obliczonej wartości jest z natury powolne. Aby uzyskać dodatkową pomoc, zobacz następujące dwa łącza:
- http://www.mooreds.com/wordpress/archives/547 - "Optymalizacja obliczania odległości w zapytaniu mysql"
- Najszybsza droga znaleźć odległość między dwoma punktami szerokości/długości .
Na koniec najbliższa odpowiedź jest następująca: https://stackoverflow.com/a/4180065/1688441