これが元のクエリです
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個のID(ID 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)
;
このバージョンでは、追加のインデックスを作成する必要はありません。
試してみてください!!!