Dit is je oorspronkelijke vraag
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
U voert de paginering als laatste uit. Als u deze zoekopdracht refactoreert, kunt u de paginering eerder uitvoeren.
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)
;
Merk op dat ik een subquery heb gemaakt met de naam k
. De 10 sleutels worden EERST opgehaald en besteld!!!
Dan kunnen de JOINs vanaf daar doorgaan, hopelijk met slechts 10 location_ids.
Wat helpt de subquery k
is een index die location_id en location_type_id bevat
ALTER TABLE location ADD INDEX id_type_ndx (location_id,location_type_id);
Hier is nog iets dat je misschien leuk vindt aan deze aanpak
Hoe vraag je naar de volgende 10 ID's (ID's 11 - 20)? Zoals dit:
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)
;
Het enige wat u hoeft te doen is de LIMIT
. wijzigen clausule in subquery k
bij elke nieuwe pagina.
LIMIT 20,10
LIMIT 30,10
- en ga zo maar door...
Ik kan de refactoring verbeteren door de locatietabel te verwijderen en subquery k de benodigde velden als volgt te laten dragen:
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)
;
Het maken van die extra index zou voor deze versie niet nodig zijn.
Probeer het eens !!!