ディレクトリ
インデックスの使用シナリオ
1.テーブルの主キー
2.一意のインデックスを自動的に確立する
3.テーブルのフィールドの一意の制約4.
直接条件付きクエリのフィールド(SQLの条件付き制約に使用されるフィールド)
5
. クエリの他のテーブルに関連付けられているフィールド6。クエリ内の並べ替えられたフィールド(並べ替えられたフィールドにより、インデックスでアクセスした場合の並べ替え速度が大幅に向上します)
7.クエリ内の統計またはグループ化された統計フィールド
8.テーブル内のレコードが少なすぎる(テーブル内のレコードが5つしかなく、インデックスを使用してレコードにアクセスする場合、最初にインデックステーブルにアクセスする必要があり、次にインデックステーブルを介してデータテーブルにアクセスします。通常、インデックステーブルとデータテーブルは同じデータブロック内にありません)
9 、頻繁に挿入、削除、変更されたテーブル(頻繁に処理されるビジネステーブルの場合、クエリで許可されている場合は、インデックスを最小化する必要があります)
10.データの重複と均等に分散されたテーブルフィールド(テーブルに100,000行のレコードがある場合、 2つだけのT及びF値の種類、及び約50%の各値の確率分布は、このテーブル構成インデックスのフィールドは、一般的に、データベースのクエリ速度を改善しないフィールド。)
11、およびしばしばメインフィールドが、クエリ多くのメインフィールドインデックス値を持つテーブルフィールド
12.数千万のMySQLデータベースにインデックスを付けるための事項とパフォーマンスを改善する手段
インデックス付けに適した列
1. where句、group by句、order by句、on句で、句の列にインデックスを追加します
。2。インデックスフィールドが小さいほど、データベースのデータストレージユニットが "ページ"であるため、より多くのデータが保存されます。 IOも大きくなる
3.分散が大きいカラムを結合インデックスの前に配置します。
select * from payment where staff_id =2 and customer_id =584;
結合インデックスを確立するには、上記のSQLの前にどの列を配置する必要がありますか?
これら2つのフィールドの異なるIDの数を個別に見てください。数値が大きいほど、分散の度合いが大きくなります。したがって、次の図からわかるようになります:customer_idの分散の度合いが大きい
結論:customer_idの分散が大きいため、インデックス(customer_id、staff_id)を使用することをお勧めします
関節指数
命名規則
1. where条件でインデックスを作成する必要がある
フィールド2.データ量が少ないフィールドをインデックス作成する必要がない
3. OR条件がwhere条件である場合、インデックスが機能しない
4.左端の原則を満たす
ジョイントインデックスとは
1. 2つ以上の列のインデックスは、結合インデックスまたは複合インデックスと呼ばれます。
2.インデックスに列を追加すると、検索を絞り込むことができますが、2つの列を持つインデックスを使用することは、2つの個別のインデックスを使用することとは異なります。複合インデックスを作成するときは、列の順序を慎重に検討する必要があります。複合インデックスは、インデックスのすべての列または最初の数列のみを検索する場合に非常に役立ちます。後続の列のみを検索する場合、複合インデックスは役に立ちません。
インデックス最適化SQLメソッド
1.インデックスのメンテナンスと最適化(重複インデックスと冗長インデックス)
インデックスを増やすとクエリの効率が向上しますが、挿入、更新、削除の効率が低下しますが、実際にはそうではない場合が多く、インデックスが多すぎると使用に影響するだけではありません効率はクエリの効率にも影響します。これは、データベースが最初にクエリ分析に使用するインデックスを選択する必要があるためです。インデックスが多すぎると、分析プロセスが遅くなり、クエリの効率も低下します。増やす方法を知ってください。不要なインデックスを維持および削除するために知っておく必要がある場合があります。
2.重複した冗長なインデックスを見つける方法
- 繰り返しインデックス:
繰り返しインデックスとは、同じ列によって同じ順序で作成された同じ種類のインデックスを指します。次の表の主キーとID列のインデックスは繰り返しインデックスです。
create table test(
id int not null primary key,
name varchar(10) not null,
title varchar(50) not null,
unique(id)
)engine=innodb;
- 冗長インデックス:
冗長インデックスとは、複数のインデックスのプレフィックス列が同じであるか、主キーが結合インデックスに含まれているインデックスを指します。次の例では、キー(名前、ID)は冗長インデックスです
create table test(
id int not null primary key,
name varchar(10) not null,
title varchar(50) not null,
key(name,id)
)engine=innodb;
3. pt-duplicate-key-checkerツールを使用して、重複するインデックスを見つけます
pt-duplicate-key-checker -uroot -padmin -h 127.0.0.1
4.インデックスのメンテナンス方法
業務の変更により、一部のインデックスは後で使用する必要がないため、削除する必要があります。mysqlでは、pt-index-usageツールでスロークエリログを使用して、インデックスの使用状況を分析できます。
pt-index-usage -uroot -padmin /var/lib/mysql/mysql-host-slow.log
インデックスを使用する際の考慮事項
1.インデックスを作成する
多くの場合、インデックスを追加するのを忘れたか、またはより効果的なインデックスを追加しなかったため、パフォーマンスの問題は非常に単純です。インデックスが追加されていない場合、特定のデータを見つけるために全テーブルスキャンが実行されます。テーブル内のデータの量が多く、適格な結果が少ない場合、インデックスがないと致命的なパフォーマンスの低下を引き起こします。 。ただし、いずれの場合もインデックスを作成する必要はありません。たとえば、性別の値が2つしかない場合があります。インデックス付けには利点がないだけでなく、更新速度にも影響します。これを過度のインデックス付けと呼びます。
2、コンポジット索引
このようなステートメントがあるよう:面積=ユーザーからの選択* 「北京」と年齢= 22;
私たちは地域や年齢上の単一のインデックスを作成するのであれば、その後だったが、MySQLのクエリは、一度に1つを使用することができますので、インデックス付け。これにより、インデックス付けなしの全テーブルスキャンの効率が比較的向上しましたが、area列とage列に複合インデックスを作成すると、効率が向上します。(area、age、salary)の複合インデックスを作成する場合、それは実際には(area、age、salary)、(area、age)、(area)3つのインデックスを作成することと同等であり、これは左端の最高のプレフィックスと呼ばれます特徴
。したがって、複合インデックスを作成するときは、制約として最も一般的に使用される列を左側に配置し、次に降順にする必要があります。
3.インデックスには、NULL値の列は含まれません。
列にNULL値が含まれている限り、その列はインデックスに含まれません。複合インデックスの列にNULL値が含まれている限り、この列はこの複合インデックスに対して無効です。したがって、データベースの設計時にフィールドのデフォルト値をNULLにしないでください。
4.短いインデックス
を使用して文字列列にインデックスを付けます。可能であれば、プレフィックス長を指定する必要があります。たとえば、CHAR(255)列がある場合、最初の10文字または20文字内で複数の値が一意であれば、列全体にインデックスを付けないでください。インデックスが短いと、クエリの速度が向上するだけでなく、ディスク容量とI / O操作も節約できます。
5、ソートされたインデックスの問題
mysqlクエリは1つのインデックスのみを使用するため、where句でインデックスが使用されている場合、順番に列がインデックスを使用しません。したがって、データベースのデフォルトのソートで要件を満たすことができる場合は、ソート操作を使用しないでください。複数の列のソートを含めないようにしてください。必要に応じて、これらの列の複合インデックスを作成することをお勧めします。
6. Like文の操作
一般的には、Like文の使用はお勧めできませんが、どうしても必要な場合は、使い方にも問題があります。「%aaa%」のようにインデックスを使用せず、「aaa%」のようにインデックスを使用できます。
7.
YEAR(adddate)×
8. NOT IN操作
NOT IN操作は、インデックスを使用しないため、全表スキャンになります。NOT INはNOT EXISTSに置き換えることができます