ホームページ >データベース >mysql チュートリアル >遅い WHERE IN 句を使用した MySQL クエリを最適化するにはどうすればよいですか?
WHERE IN 句を使用した MySQL クエリの最適化
遅い Rails アプリのデータベース クエリのトラブルシューティング中に、フル テーブル スキャンを実行する IN 句を使用したクエリが発生しました。適切なインデックスが存在するにもかかわらず。たとえば、次のようなクエリは、
SELECT `user_metrics`.* FROM `user_metrics` WHERE (`user_metrics`.user_id IN (N,N,N,N,N,N,N,N,N,N,N,N))
user_id 列のインデックスを利用できません。
MySQL インデックスの使用法について
MySQL は利用します。 IN 句が WHERE 条件に存在する場合、インデックスは自動的に使用されません。インデックスの使用を強制するには、次のオプションを調査できます。
テーブル サイズの重要性を確認する
小さなテーブルでは、テーブル スキャンの方がインデックス検索より効率的です。 I/O オーバーヘッド。 user_metrics テーブルがインデックスの使用を保証するのに十分な大きさであることを確認してください。
コストベースの最適化
MySQL にはコストベースのオプティマイザーも組み込まれています。テーブルに対して ANALYZE を実行して、統計情報をオプティマイザーに提供します。これは、クエリ実行計画についてより多くの情報に基づいた決定を下すのに役立ちます。 ANALYZE の実行に失敗すると、パフォーマンスが最適化されない可能性があります。
ヒントの使用法
MySQL では、FORCE INDEX などのヒントを使用して、使用するインデックスを明示的に指定できます。ただし、これは ActiveRecord の目的を損ない、手動によるクエリの変更が必要となるため、Rails アプリケーションでは現実的ではない可能性があります。
代替データベースを検討する
場合によっては、MySQL のクエリ オプティマイザーには制限がある場合があります。パフォーマンスが依然として満足できない場合は、Postgres などの代替データベース ソリューションを検討することを検討してください。Postgres は、ActiveRecord ベースの Rails アプリケーションでそのようなクエリをより効率的に処理すると報告されています。
以上が遅い WHERE IN 句を使用した MySQL クエリを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。