Oto Twoje oryginalne zapytanie
SELECT l.location_id, l.location_name,
t.type_id, t.type_name,
i.location_address, i.location_phone
FROM location AS l
LEFT JOIN location_information AS i ON (l.location_id = i.location_id)
LEFT JOIN location_types AS t ON (l.location_type_id = t.type_id)
ORDER BY l.location_id DESC
LIMIT 10
Paginację wykonujesz na końcu. Jeśli dokonasz refaktoryzacji tego zapytania, możesz przeprowadzić paginację wcześniej.
SELECT l.location_id, l.location_name,
t.type_id, t.type_name,
i.location_address, i.location_phone
FROM
(SELECT location_id,location_type_id FROM location
ORDER BY location_id LIMIT 10) AS k
LEFT JOIN location AS l ON (k.location_id = l.location_id)
LEFT JOIN location_information AS i ON (k.location_id = i.location_id)
LEFT JOIN location_types AS t ON (l.location_type_id = t.type_id)
;
Zauważ, że utworzyłem podzapytanie o nazwie k
. 10 kluczy zostaje odebranych i zamówionych PIERWSZE !!!
Następnie JOIN mogą być kontynuowane, miejmy nadzieję, że przy użyciu zaledwie 10 identyfikatorów lokalizacji.
Co pomoże podzapytaniu k
to indeks zawierający location_id i location_type_id
ALTER TABLE location ADD INDEX id_type_ndx (location_id,location_type_id);
Oto coś, co może Ci się spodobać w tym podejściu
Jak zapytać o kolejne 10 identyfikatorów (identyfikatory 11 - 20)? Tak:
SELECT l.location_id, l.location_name,
t.type_id, t.type_name,
i.location_address, i.location_phone
FROM
(SELECT location_id,location_type_id FROM location
ORDER BY location_id LIMIT 10,10) AS k
LEFT JOIN location AS l ON (k.location_id = l.location_id)
LEFT JOIN location_information AS i ON (k.location_id = i.location_id)
LEFT JOIN location_types AS t ON (l.location_type_id = t.type_id)
;
Wszystko, co musisz zrobić, to zmienić LIMIT
klauzula w podzapytaniu k
z każdą nową stroną.
LIMIT 20,10
LIMIT 30,10
- i tak dalej...
Mogę poprawić refaktoryzację, usuwając tabelę lokalizacji i zlecając podzapytanie k przenosić potrzebne pola w następujący sposób:
SELECT k.location_id, k.location_name,
t.type_id, t.type_name,
i.location_address, i.location_phone
FROM
(SELECT location_id,location_type_id,location_name
FROM location ORDER BY location_id LIMIT 10,10) AS k
LEFT JOIN location_information AS i ON (k.location_id = i.location_id)
LEFT JOIN location_types AS t ON (k.location_type_id = t.type_id)
;
Dodanie tego dodatkowego indeksu nie byłoby konieczne w tej wersji.
Spróbuj !!!