Ето оригиналното ви запитване
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
Извършвате пагинацията последна. Ако преработите тази заявка, можете да извършите пагинацията по-рано.
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)
;
Забележете, че създадох подзаявка, наречена k
. 10-те ключа се вземат и поръчват ПЪРВИ !!!
След това JOIN могат да продължат от там, надявам се да използвате само 10 location_id.
Какво ще помогне на подзаявката k
е индекс, който носи location_id и location_type_id
ALTER TABLE location ADD INDEX id_type_ndx (location_id,location_type_id);
Ето нещо друго, което може да ви хареса в този подход
Как правите заявка за следващите 10 идентификатора (идентификатори 11 - 20)? Като това:
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)
;
Всичко, което трябва да направите, е да промените LIMIT
клауза в подзаявка k
с всяка нова страница.
LIMIT 20,10
LIMIT 30,10
- и така нататък...
Мога да подобря рефакторинга, като премахна таблицата за местоположение и накарам подзаявката k да носи необходимите полета по следния начин:
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)
;
Създаването на този допълнителен индекс не би било необходимо за тази версия.
Опитайте !!!