LIMIT 句は、通常、MySQL テーブルからレコードのサブセットを取得するために使用されます。ただし、オフセット値 (m) が大きくなると、クエリのパフォーマンスが大幅に低下する可能性があります。これは、MySQL が通常、シーケンシャル スキャンを使用して、目的のオフセットに達するまでテーブル全体を走査するためです。
このパフォーマンスの問題を軽減するには、データベースの主キーに対応するシーケンシャル キーを確立するインデックス テーブルを作成することを検討してください。ターゲットテーブル。 「インデックス テーブル」として知られるこの補助テーブルは、ターゲット テーブルと目的の行の間のブリッジとして機能します。
インデックス テーブルをターゲット テーブルに結合することで、WHERE 句を使用して効率的に実行できます。必要な特定の行を取得します。このアプローチを実装する方法は次のとおりです。
CREATE TABLE seq ( seq_no int not null auto_increment, id int not null, primary key(seq_no), unique(id) );
TRUNCATE seq; INSERT INTO seq (id) SELECT id FROM mytable ORDER BY id;
オフセット 1,000,000 および制限 1000 の行を取得するには、次のクエリを実行します:
SELECT mytable.* FROM mytable INNER JOIN seq USING(id) WHERE seq.seq_no BETWEEN 1000000 AND 1000999;
この最適化されたクエリは、インデックス付けテーブルを活用して、順次スキャンをバイパスし、目的の行に直接アクセスします。その結果、オフセット値が大きい場合でも、パフォーマンスが大幅に向上するはずです。
以上が大きなオフセットを使用して MySQL LIMIT クエリを最適化するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。