sql >> データベース >  >> RDS >> Mysql

左結合による正確なページネーション

    これが元のクエリです

    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) 
    ;
    

    このバージョンでは、追加のインデックスを作成する必要はありません。

    試してみてください!!!



    1. 集約とパーティショニング

    2. selectにアスタリスクが存在すると、他の列が除外されますか?

    3. PHPスクリプトを毎日自動的に実行する方法は?

    4. MySQLマッチの問題