Ini kueri asli Anda
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
Anda melakukan pagination terakhir. Jika Anda memfaktorkan ulang kueri ini, Anda dapat melakukan pagination lebih awal.
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)
;
Perhatikan saya membuat subquery bernama k
. 10 kunci diambil dan dipesan PERTAMA !!!
Kemudian JOIN dapat dilanjutkan dari sana, semoga hanya menggunakan 10 lokasi_id.
Apa yang akan membantu subkueri k
adalah indeks yang membawa location_id dan location_type_id
ALTER TABLE location ADD INDEX id_type_ndx (location_id,location_type_id);
Berikut adalah hal lain yang mungkin Anda sukai tentang pendekatan ini
Bagaimana Anda meminta 10 id berikutnya (id 11 - 20)? Seperti ini:
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)
;
Yang harus Anda lakukan adalah mengubah LIMIT
klausa dalam subquery k
dengan setiap halaman baru.
LIMIT 20,10
LIMIT 30,10
- dan seterusnya...
Saya dapat meningkatkan pemfaktoran ulang dengan menghapus tabel lokasi dan meminta subquery k membawa bidang yang diperlukan seperti ini:
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)
;
Membuat indeks ekstra itu tidak diperlukan untuk versi ini.
Cobalah !!!