Voici votre requête d'origine
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
Vous effectuez la pagination en dernier. Si vous refactorisez cette requête, vous pouvez effectuer la pagination plus tôt.
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)
;
Remarquez que j'ai créé une sous-requête appelée k
. Les 10 clés sont récupérées et commandées EN PREMIER !!!
Ensuite, les JOIN peuvent continuer à partir de là, en espérant utiliser seulement 10 location_ids.
Qu'est-ce qui aidera la sous-requête k
est un index qui contient location_id et location_type_id
ALTER TABLE location ADD INDEX id_type_ndx (location_id,location_type_id);
Voici quelque chose d'autre que vous pourriez aimer à propos de cette approche
Comment interrogez-vous les 10 prochains identifiants (ids 11 - 20) ? Comme ceci :
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)
;
Tout ce que vous avez à faire est de changer le LIMIT
clause dans la sous-requête k
à chaque nouvelle page.
LIMIT 20,10
LIMIT 30,10
- et ainsi de suite...
Je peux améliorer la refactorisation en supprimant la table d'emplacement et en faisant en sorte que la sous-requête k porte les champs nécessaires comme ceci :
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)
;
Faire cet index supplémentaire ne serait pas nécessaire pour cette version.
Essayez-le !!!