sql >> データベース >  >> RDS >> Mysql

MySQLビューは常に全表スキャンを実行しますか?

    MySQLのビューはインデックス付けされていないため、その性質上、アクセスするたびにフルスキャンが必要です。一般的に、これにより、ビューは、小さな結果セットを返す非常に複雑な静的クエリがあり、毎回結果セット全体を取得する予定の場合にのみ役立ちます。

    編集: もちろん、ビューは基になるテーブルのインデックスを使用して、ビュー自体が最適化されます(そうでない場合、使用してもまったく意味がありません)が、ビューにはインデックスがないため、WHEREクエリを実行することはできません。最適化するビュー。

    ビューのインデックスを作成すると、とにかくコストがかかります。これは、ビューのプロファイルを作成しようとはしていませんが、一時テーブルがバックグラウンドで作成され、結果セットが返されることを確信しているためです。一時テーブルの作成にはすでにかなりの時間がかかります。必要なインデックスを推測しようとするビューは必要ありません。これは、MySQLが現在、ビューに使用するインデックスを指定するメソッドを提供していないという2番目のポイントをもたらします。それでは、どのフィールドにインデックスを付ける必要があるかをどのように知るのでしょうか。それはあなたの質問に基づいて推測しますか?

    一時テーブル の使用を検討してください。 これは、一時テーブルのフィールドにインデックスを指定できるためです。ただし、経験から、これは本当に、本当に遅い傾向があります。

    このビューに含まれるものがすべてSELECTALLFROM table1、table2、table3である場合、次に、なぜこのクエリをビューに含める必要があるのか​​を尋ねる必要がありますか?何らかの理由でどうしても必要な場合は、ストアドプロシージャを使用してクエリをカプセル化すると、結果セットのデータベースへの呼び出しが簡単になるという利点を維持しながら、最適化されたパフォーマンスを得ることができます。

    >

    1. C#を使用して挿入された行のIDを取得します

    2. mySQLSELECTの今後の誕生日

    3. OracleRACネットワークおよびIP情報の確認

    4. PostgreSQLデータベース内のサイズ(相対および絶対)のスキーマのリスト