MySQL のページング クエリは通常、limit
を通じて実装されます。
MySQL の limit
基本的な使用法は非常に簡単です。 limit
1 または 2 つの整数パラメータを受け取ります。パラメータが 2 つある場合、最初のパラメータは最初に返されるレコード行のオフセットを指定し、2 番目のパラメータは返されるレコード行の最大数を指定します。最初のレコード行のオフセットは 0 です。
PostgreSQL との互換性のために、limit
は limit # offset
# もサポートします。
問題:
オフセットが小さい場合、limit
を直接使用してクエリを実行しても問題ありませんが、データ量が増加すると、ページが後ろに進むほど、limit
ステートメントのオフセットが大きくなり、速度が大幅に遅くなります。
#最適化のアイデア:
データ量が多い場合は、あまりにも多くのレコードをスキャンしないでください
#解決策 :
サブクエリ ページング メソッドまたは JOIN ページング メソッド。 JOIN ページングとサブクエリ ページングの効率は基本的に同じレベルであり、消費される時間も基本的に同じです。 これが例です。通常、MySQL の主キーは自動インクリメントする数値型ですが、この場合は以下の方法で最適化できます。 実際の運用環境で 800,000 個のデータを含むテーブルを例として、最適化の前後でクエリ時間を比較します。-- 传统limit,文件扫描 [SQL]SELECT * FROM tableName ORDER BY id LIMIT 500000,2; 受影响的行: 0 时间: 5.371s -- 子查询方式,索引扫描 [SQL] SELECT * FROM tableName WHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 500000 , 1) LIMIT 2; 受影响的行: 0 时间: 0.274s -- JOIN分页方式 [SQL] SELECT * FROM tableName AS t1 JOIN (SELECT id FROM tableName ORDER BY id desc LIMIT 500000, 1) AS t2 WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT 2; 受影响的行: 0 时间: 0.278sパフォーマンスが 20 近く向上していることがわかります。最適化後の%。
最適化原理:
サブクエリはインデックス上で完了しますが、通常のクエリはデータ ファイル上で完了します。一般に、インデックス ファイルはデータ ファイルよりも大きくなります。はるかに小さいため、操作がより効率的になります。すべてのフィールドの内容を取得するには、最初の方法は多数のデータ ブロックにまたがってそれらを取得する必要があるのに対し、2 番目の方法は基本的に、対応する内容を取得する前にインデックス フィールドに従って直接位置を特定するためです。当然効率も大幅に向上します。 したがって、
limit の最適化は、limit
を直接使用するのではなく、最初にオフセット ID を取得し、次に limit
を直接使用することです。データを取得するためのサイズ。 実際のプロジェクト運用では、ストラテジモードと同様の方法でページングを行うことができ、例えば1ページあたり100個のデータがある場合、100ページ以内と判断した場合は、最も基本的なページング方法。100 を超える場合は、サブクエリ ページネーション方法を使用します。
MySQL チュートリアル 列にアクセスして学習してください。
以上がMySQL の制限にはパフォーマンスの問題があることをご存知ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。