Rafał
Plewa
Manager IT,
Tourmedica.pl Sp. z
o.o.
Temat: Lista wyników z końca dużej tabeli, offset i długie czasy
Witam,Mam od dawna problem z optymalizacją zapytań do pewnej tabeli MySQL. Szukam jakiegoś sposobu lub chociaż punktu zaczepienia, jak mógłbym zwiększyć wydajność moich zapytań.
Tabela `terminy` (InnoDB) zawiera ok. 3 mln rekordów (700mb).
Potrzebuję odpytać tą tabelę, aby wylistować w PHP rekordy w postaci stronicowanej (np. co 10 rekordów) listy terminów.
Poniższe zapytanie działa świetnie:
SELECT SQL_NO_CACHE id, cena FROM terminy LIMIT 10 OFFSET 0
(czas 0.00001 sekundy)
Ale wraz z zagłębianiem się w głąb tabeli (duży offset) jest już tragicznie:
SELECT SQL_NO_CACHE id, cena FROM terminy LIMIT 10 OFFSET 2000000
(czas 11 sekund !!!)
Gdy wstawiam warunki WHERE jest jeszcze gorzej, nie mówiąć o łączeniu tej tabeli z innymi. Oczywiście indeksy są pozakładane, na różne pola, co przyspiesza, ale nie jakoś szczególnie drastycznie.
Moja prośba do Was jest taka: czy macie jakiś pomysł na technikę którą mógłbym tutaj zastosować? Czasy jakie chciałbym osiągnąć przy wertowaniu końcowych rekordów to ok 1 sekundy. 3 miliony rekordów to nie jakoś szczególnie dużo, dlatego jestem pewien, że czasy do 1 sekundy są realne.