Aquí está su consulta original
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
Realiza la paginación en último lugar. Si refactoriza esta consulta, puede realizar la paginación antes.
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)
;
Observe que creé una subconsulta llamada k
. ¡Las 10 llaves se recogen y se piden PRIMERO!
Luego, los JOIN pueden continuar desde allí, con la esperanza de usar solo 10 ID de ubicación.
Lo que ayudará a la subconsulta k
es un índice que lleva location_id y location_type_id
ALTER TABLE location ADD INDEX id_type_ndx (location_id,location_type_id);
Aquí hay algo más que te puede gustar de este enfoque
¿Cómo consulta los próximos 10 ID (ID 11 - 20)? Así:
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)
;
Todo lo que tienes que hacer es cambiar el LIMIT
cláusula en la subconsulta k
con cada nueva página.
LIMIT 20,10
LIMIT 30,10
- y así sucesivamente...
Puedo mejorar la refactorización eliminando la tabla de ubicación y haciendo que la subconsulta k lleve los campos necesarios como este:
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)
;
Hacer ese índice adicional no sería necesario para esta versión.
Pruébalo !!!