Här är din ursprungliga fråga
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
Du utför sideringen sist. Om du refaktorerar den här frågan kan du utföra sideringen tidigare.
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)
;
Observera att jag skapade en underfråga som heter k
. De 10 nycklarna hämtas och beställs FÖRST!!!
Sedan kan JOINs fortsätta därifrån, hoppas att du använder bara 10 location_ids.
Vad hjälper underfrågan k
är ett index som bär location_id och location_type_id
ALTER TABLE location ADD INDEX id_type_ndx (location_id,location_type_id);
Här är något annat du kanske gillar med detta tillvägagångssätt
Hur frågar du efter de kommande 10 id (id 11 - 20)? Så här:
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)
;
Allt du behöver göra är att ändra LIMIT
sats i underfrågan k
med varje ny sida.
LIMIT 20,10
LIMIT 30,10
- och så vidare...
Jag kan förbättra refactoring genom att ta bort platstabellen och låta subquery k bära de nödvändiga fälten så här:
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)
;
Att göra det extra indexet skulle inte vara nödvändigt för den här versionen.
Ge det ett försök !!!