2009-04-12 15 views
6

mieć ogromny tabeli mysql z podobnym 300.000 rekordów i chciał stronie rekordy w PHP (nie chodzi tu jednak) z kwerendy w ten sposób:MySQL problemy duża wydajność stół podczas stronicowania z PHP

SELECT * FROM `table` LIMIT 250000, 100 

W drugiej części rekordu może być znacznie wolniejszy, zwłaszcza gdy znajduje się blisko końca tabeli (LIMIT zaczyna się bardzo duży). Zgaduję, że MySQL musi liczyć aż do 250000 przed odebraniem mi wyników?

Jak obejść to lub inne podejście do stronicowania, które może być znacznie szybsze? Dzięki!

Odpowiedz

4

Upewnij się, że używasz indeksu, w przeciwnym razie wykonuje pełne skanowanie tabeli. Możesz sprawdzić plan wykonania, aby to zweryfikować lub wymusić wydanie, używając klauzuli ORDER BY (w indeksowanej kolumnie). Oto more information.

Twój stół nie jest duży w 300 tys. Wierszy. Występują problemy z wydajnością podczas zbliżania się do stołu. Jedynym realnym rozwiązaniem jest sfałszowanie klauzuli limitu. Posiadaj pole automatycznego zwiększania liczby wierszy od 1 do 300 000, a następnie:

SELECT * 
FROM mytable 
WHERE field BETWEEN 250000 and 250100 

lub podobne. Może to być problematyczne lub niemożliwe, jeśli często usuwasz wiersze, ale staram się stwierdzić, że starsze dane mają tendencję do mniejszej zmiany, więc możesz nieco zoptymalizować je, używając LIMIT dla pierwszych 100 000 wierszy i zastępczej kolumny stronicowania.

0

Czy to naprawdę całe zapytanie, czy też posiadasz klauzulę ORDER BY? Ponieważ to znacznie spowolni takie zapytania. Powinien pomóc, jeśli uda ci się zdobyć indeks na cały zestaw rzeczy, które zamawiasz.

+0

proszę przesłać posty jak ten jako komentarz, a nie odpowiedzi. To nie jest odpowiedź. – Will

1

Masz rację: MySQL musi przeskanować 250000 niepotrzebnych wierszy przed przeczytaniem tych, które chcesz. Naprawdę nie ma obejście tego Zapisz podział tabeli na kilka z nich lub z hack, takich jak:

SELECT * FROM table WHERE id BETWEEN 250000 AND 250000 + 100 - 1 
;or 
SELECT * FROM table WHERE id > 250000 ORDER BY id ASC LIMIT 100 

Ale to jeszcze nie dokładnie naśladować funkcję operatora LIMIT o złożonych zapytań. To szybkość: koszt alternatywny funkcjonalności.

0

Jeśli masz pole autoIncrement, można po prostu zrobić:

SELECT * FROM table 
WHERE ID > @LastID 
ORDER BY ID 
LIMIT 100 
+0

Zakładając, że dane nigdy nie zostały usunięte, to znaczy. – ceejayoz