背景
我々は通常、私たちの練習には制限を使用することでオフセットを加え、改ページは、開発の過程で避けられない使用しますselect * from table where column=xxx order by xxx limit 1,20
。
データの量は、(100万未満)小さいとき、あなたはページをめくるどんなには、パフォーマンスが非常に高速です。クエリが遅い場合は、限り
インデックスを作成して解決することができる場所と秩序の列によって上の条件。ときに、データの量がとき(小さな直列に遭遇した状況はしかし、
5億データである)、最後の数ページへのターン場合でも、インデックスの追加かかわらず、クエリはそれを引き起こすものである、非常に遅いのですか?どのように我々はそれを解決するのですか?
原則として制限をページング
我々は最後の数ページをオンにすると、通常のSQLクエリ:select * from table where column=xxx order by xxx limit 1000000,20
。
クエリ非常に遅いです。速度が遅いないときしかし、我々は、最初の数ページを参照してください。制限が過ぎるによって引き起こされるオフセットからです。
制限MySQLを使用する場合、原則として(例えば上記の例を使用して)。
- MySQLは1000020件のレコードをチェックします。
- そして、1,000,000レコードの前にそれを与えます。
- 残りの20件のレコードを返します。
上記の方法は、「ハイパフォーマンスMySQLの」本が確認されました。
ソリューション
解決策はなく、我々はインデックス列の後ろに検出されたことを選択したインデックススキャン範囲を使用しようとしている
すべての列の、これは列IDの最良の指標です。その後、再度クエリが返すすべての列に関連付けられます。
実施形態上記のSQLは、最終的には、最適化されていないSQLを以下のように記述することができ、実行時間最適化されたSQL 0.3秒以上、複数の実行時間を2S
SELECT * FROM Tテーブル 内部結合( SELECT IDを FROM テーブル WHERE xxx_id = 143381 LIMIT 800000,20 )T1 ON t.id = t1.id