どのように効率を最大化するために、インデックスを介してSQLクエリを作るには?

序文

最適化するために、SQLパフォーマンスチューニングは2次元、論理的なクエリの最適化から行くことができることを私たちは皆知っているが、他の物理的なクエリの最適化です。論理クエリの最適化が高くなる可能性があり、それを別の書かれたクエリの実行効率を入れて、言うぶっきらぼうに、効率を高めるために、SQLクエリ等価変換することです。物理的なクエリの最適化インデックス技術と接続テーブルによって最適化することです。それがインデックス化効率でSQLクエリを最適化することになると、最初にすべての私たちは、法律は、インデックスを作成するために持っているかを知る必要があります。

どのような法律は、インデックスを作成していますか?

インデックスを作成するための一定のルールがあります。これらの法律が発生した場合、我々は、インデックスを作成することで、クエリのパフォーマンスを向上させることができます。

どのような状況下では、インデックスを作成することができます。

1は、そのようなユーザー名などの制限のユニークな数値フィールド、
インデックス自体は、一意のインデックスなどの制約として作用することができる、インデックス、主キー、一意性制約が機能してもよいです。フィールドは、自然の中で一意である場合、データテーブルでは、あなたが直接、ユニーク制約または主キーのインデックスを作成することができます。
特に大規模なデータテーブル場合に照会条件、しばしばフィールドとして2、
3、カラムBY頻繁GROUP BYのために必要とORDER
4、UPDATE、DELETE条件列は、一般的にインデックスを作成する必要がある
5、DISTINCTフィールドを作成する必要インデックスは、
マルチテーブルインデックスが、以下の原則に注意を払うに必要な作成、結合操作を登録しようか。

  • 各追加のテーブルは、ネストされたループの増加に相当しますので、3以上のテーブル番号に参加しないようにしよう、大きさの増加のためには、真剣に、クエリの効率に影響を与える、非常に高速になります
  • フィールドの接続、および一貫していなければならない複数のテーブルのフィールドタイプのインデックスを作成します。
    例:
    接続をJOIN使用して、このSQLは、フィールドは、他のタイプのVARCHAR intの一つではないユーザテーブルにUSER_ID辺一貫したproduct_commentテーブルとフィールドタイプ上に残さなければなりません。
SELECT comment_id, comment_text, product_comment.user_id, user_name FROM product_comment JOIN user ON product_comment.user_id = user.user_id
WHERE comment_text = '462eed7ac6e791292a79'

どのような状況下では、インデックスを作成する必要はありません。

インデックスは万能薬ではない、などのインデックスを作成する必要はありませんいくつかの例がある:
ないからあれば1が以下のフィールドよりもインデックスを作成する必要はありません(GROUP BY、ORDER BYを含む)WHERE条件は、インデックスの値は、すぐに見つけることですフィールドを検索するために、通常、あなたは、インデックスを作成する必要はありません。
例えば:

SELECT comment_id, product_id, comment_time FROM product_comment WHERE user_id = 41251

これは、上記のSQLを取得することがUSER_IDに従っているので、これらのフィールドはSELECTフィールドに表示されていても、他のフィールドにインデックスを作成する必要はありません。
2は、表には、1000未満として、あまりにも記録し、インデックスを作成する必要はありません。クエリ効率に索引を作成するかどうかを表レコードあまりにもほとんど影響は重要ではありません。
図3は、重複データがたくさんある分野ならば、そのような性別フィールドとして、インデックスを作成しないでください。さらにまた、我々は、値の分布を検討する必要があります。
4、頻繁に更新さフィールドは、インデックスを作成する必要はありません。負担は、このように効率に影響を与えるとき、インデックスは、あまりにも、インデックスを更新する場合、更新されたデータなので、必要性は、インデックスを更新します。

どのような状況下では、インデックスが失敗します

共通のインデックスの失敗の例:
インデックスが式を計算した場合は1が、それは失敗します。
たとえば:
comment_idインデックスが追加されたため、この分野でのSQLの実行プロセスが式を計算した場合、インデックスが失敗します。

SELECT comment_id, user_id, comment_text FROM product_comment WHERE comment_id+1 = 900001

2.インデックスに関数を使用している場合、それはまた、故障の原因となります。
たとえば:
COMMENT_TEXTフィールドにインデックスを追加するために、SUBSTRING関数の実行中に、この分野でのSQLの実行プロセスは、インデックスが失敗する場合。

 SELECT comment_id, user_id, comment_text FROM product_comment WHERE SUBSTRING(comment_text, 1,3)='abc'

WHERE句3、ORの前に列挙された条件が索引付けされている場合、及びOR列が索引付けされていない後の状態では、インデックスは失敗します。
したがって、唯一の条件欄があれば、条件付き列が索引付けされないように、それはフルテーブルスキャン、インデックスしたがってカラムの条件は失敗となり、意味をなさないインデックスされます。
例えば:

 SELECT comment_id, user_id, comment_text FROM product_comment WHERE comment_id = 900001 OR comment_text = '462eed7ac6e791292a79'

図4は、我々があいまいクエリLIKEを使用する場合%の後ろにすることはできません。

たとえば:
これは、そうでない場合は、インデックスが無効になり、辞書がアルファベット順にソートした場合、我々は上から試合を開始します、中央の位置が一致しません、よく理解されています。

 SELECT comment_id, user_id, comment_text FROM product_comment WHERE comment_text LIKE '%abc'

5は、列インデックスは可能ではないのNULL制約に設定されています。
この方法の利点は、あなたがより良いスペースを節約し、インデックスを使用し、さらにSQL操作を加速することができるということです。
テーブルのデザインでフィールドNOT NULL制約を設定することが好ましいことになるので、インデックス列NOT NULL、全表スキャンを取る必要があるかどうかを判断します。
そのようなフィールドとしてINT型、デフォルト値はゼロに設定されてもよいです。空の文字列(「」)に設定された文字型のデフォルト値。
一番左に注意を払うに連動インデックス原則的に使用さ6、
左端の原理は、SQLステートメント、フィールドで左から右にインデックスニーズがそうでなければ、インデックスのみの関節の一部が、左端から開始する必要性を使用することができます使用することです彼らは失敗します。

概要

SQLクエリの効率を向上させることができる優れたインデックスを使用してください。注インデックス番号が不可能な追加、インデックスにもスペースを取り、そうではなく、新しいインデックスを作成するよりも、可能な限り、インデックスの拡大ということ。そして、インデックス数のコストは、より多くのメンテナンスも書き込み効率が得られ、大きくなる必要は低くなります。また、インデックスがSQLクエリで値を最大化することを可能にするように、使用されたことがないインデックスを除去することができるため、使用のローにクエリのインデックスを定期的にする必要があります。

この記事では、オタクのコースを参照して通信することを歓迎 - コメント欄に

公開された184元の記事 ウォンの賞賛200 ・は 80000 +を見て

おすすめ

転載: blog.csdn.net/Sophia_0331/article/details/105222801