sql単純最適化

2927 ワード

1、クエリーを最適化するには、できるだけ全表スキャンを避けるべきで、まずwhereおよびorder byに関連する列にインデックスを確立することを考慮しなければならない.
  • 実際には、インデックスもプライマリ・キーとインデックス・フィールドを保存し、エンティティ・テーブルのレコードを指すテーブルです.
  • インデックスの使用のメリットについては前述していますが、インデックスの使用が多すぎると乱用されます.したがって、インデックスはクエリの速度を大幅に向上させると同時に、テーブルに対してINSERTUPDATEおよびDELETEを行うなど、テーブルの更新速度を低下させるという欠点もあります.表を更新するとき、MySQLはデータを保存するだけでなく、インデックスファイルも保存します.
  • インデックスを作成すると、ディスク領域を占有するインデックスファイルが作成されます.だから慎重に.
  • 1つのテーブルのインデックス数は6つを超えないことが望ましいが、多すぎる場合は からのカラムに作成されたインデックスが必要かどうかを考慮しなければならない.
  • すべてのインデックスがクエリーに有効であるわけではありません.SQLはテーブルのデータに基づいてクエリーの最適化を行います.インデックス列に大量のデータが重複している場合、SQLクエリーはインデックスを利用しない可能性があります.例えば、テーブルにフィールドsexがあり、male、femaleがほぼ半分ずつある場合、sexにインデックスを作成してもクエリーの効率には役立ちません.

  • 2、できるだけ where句の中でフィールドに対してnull を行うべきで、さもなくばエンジンがインデックスの使用を放棄して全表スキャンを行うことになる.
    select id from t where num is null  

    numにデフォルト値0を設定して、テーブルのnum列にnull値がないことを確認し、クエリーを実行できます.
    select id from t where num=0    

    3、できるだけ where句に!=または<>オペレータを使用しなければならない.そうしないと、エンジンはインデックスの使用を放棄して全表スキャンを行う.
    SELECT id FROM article WHERE type_name='2' OR type_name='3'; 

    次のように問い合わせることができます.
    SELECT id FROM article WHERE type_name='2' 
    UNION ALL
    SELECT id FROM article WHERE type_name='3';

    ps:しかし、本人のクエリーの結果、時間がかかってもあまり差はありません.本人のデータベースのデータ量が足りない原因かもしれません.の
    4、フィールドタイプの使用方法
  • できるだけ数値フィールドを使用し、数値情報のみを含むフィールドをできるだけ文字型に設計しないと、クエリーと接続のパフォーマンスが低下し、ストレージのオーバーヘッドが増加します.これは、クエリと接続を処理するときに、エンジンが文字列の各文字を1つずつ比較し、数値型では1回だけ比較すればよいためです.
  • 可能な限りvarcharを使用します.charの代わりに、まずフィールドの記憶領域が小さくなるため、記憶領域を節約することができます.次に、クエリーにとって、比較的小さなフィールド内での検索効率は明らかに高くなります.

  • 5、どこでもselect * from tを使用しないで、“*”の代わりに具体的なフィールドリストを使用して、使用できないフィールドを返さないでください.