大規模なデータセットを使用すると MySQL ステートメントの実行が遅くなる
大規模なデータベースを操作する場合、クエリの実行時間が問題になることがあります。この記事では、100 万を超えるレコードを持つテーブルに対するクエリの実行に 1 分以上かかる特定のシナリオについて説明します。
問題
次のクエリが引き継いでいたインデックス付きの "id" 列を使用する場合でも、実行に 1 分かかります:
SELECT * FROM `ratings` ORDER BY id LIMIT 499500, 500;
テーブルには約 100 万のレコードが含まれており、クエリには次の順序が含まれていました。
分析と解決策
クエリとテーブルの構造を調査した結果、実行が遅いことが判明しました。時間は「ファイルソート」操作の使用によるものでした。これは、MySQL が ORDER BY 句に使用する適切なインデックスを見つけられず、メモリ内のテーブル行をソートする必要がある場合に発生します。
この問題を解決するには、WHERE 句の代わりに、より選択的な WHERE 句を使用することが推奨されました。 ORDER BY 句。この場合、次のクエリの実行が大幅に高速になりました:
SELECT * FROM `ratings` WHERE id >= 499501 LIMIT 500;
このクエリは、インデックス付きの "id" 列を使用して並べ替える行を絞り込み、クエリの実行に必要な時間を大幅に短縮しました。
追加の考慮事項
ORDER の代わりに WHERE 句を使用することに注意することが重要ですBY 句は常に可能または実用的であるとは限りません。このような場合、追加のインデックスの作成やデータベース構造の最適化など、他の最適化が必要になる場合があります。さらに、潜在的なデッドロックもパフォーマンス低下の原因として除外する必要があります。
以上が大規模なデータセットで ORDER BY と LIMIT を使用した MySQL SELECT ステートメントが遅いのはなぜですか?どうすれば高速化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。