MySQL では、意図的か非意図的かにかかわらず、同じカラムに複数のインデックスを作成できます。MySQL は重複したインデックスを個別に維持する必要があり、オプティマイザもクエリを最適化するときにそれらを 1 つずつ考慮する必要があり、これがパフォーマンスに影響します。
重複インデックスとは、同じ列に同じ順序で作成された同じ種類のインデックスを指します。この方法で重複インデックスを作成することは避け、検出後すぐに削除する必要があります。ただし、さまざまなクエリのニーズを満たすために、同じ列にさまざまなタイプのインデックスを作成することができます。
CREATE TABLE test( ID INT NOT NULL PRIMARY KEY, A INT NOT NULL, B INT NOT NULL, UNIQUE(ID), INDEX(ID), ) ENGINE=InnoDB;
この SQL は 3 つの重複インデックスを作成します。通常、これを行う理由はありません。
冗長インデックスと重複インデックスにはいくつかの違いがあります。インデックス (a, b) を作成し、次にインデックス (a) を作成する場合、これは前のインデックスの接頭辞インデックスであるため、冗長インデックスになります。 (a, b) も (a) として使用できますが、b はインデックス (a, b) の左端のプレフィックス列ではないため、(b, a) は冗長インデックスではなく、インデックス (b) でもありません。さらに、同じ列に他の異なる種類のインデックス (ハッシュ インデックスやフルテキスト インデックスなど) を作成しても、対象となるインデックス列に関係なく、B ツリー インデックスの冗長インデックスにはなりません。
冗長インデックスは通常、テーブルに新しいインデックスを追加するときに発生します。たとえば、後のインデックス (A) を拡張する代わりに、新しいインデックス (A,B) を追加する場合があります。もう 1 つの状況は、インデックスを (A, ID) に拡張することです。ここで、ID は主キーです。InnoDB の場合、主キーはすでにセカンダリ インデックスに含まれているため、これも冗長です。
ほとんどの場合、冗長なインデックスは必要ありません。新しいインデックスを作成する代わりに、既存のインデックスを拡張するようにしてください。ただし、既存のインデックスを拡張するとインデックスが大きくなりすぎてパフォーマンスに影響を与えるため、パフォーマンスを考慮して冗長なインデックスが必要になる場合があります。インデックスを使用した他のクエリの実行。例: 整数列にインデックスがあり、インデックスを拡張するために非常に長い varchar 列を追加する必要がある場合、特にこのインデックスをカバーインデックスとして使用するクエリがある場合、パフォーマンスが急激に低下する可能性があります。 or this is a myisam table そして、多くの範囲クエリがあるとき (myisam のプレフィックス圧縮のため)
たとえば、userinfo テーブルがあります。このテーブルには 1,000,000 レコードがあり、state_id 値ごとに約 20,000 レコードがあります。 state_id にインデックスがあり、次の SQL を Q1 と呼びます
SELECT count(*) FROM userinfo WHERE state_id=5; --Q1
変更されたクエリの実行速度は 1 秒あたり約 115 回 (QPS) です
別の SQL もあり、Q2 と呼びます
SELECT state_id,city,address FROM userinfo WHERE state_id=5; --Q2
このクエリの QPS は 10 です。インデックスのパフォーマンスを向上させる最も簡単な方法は、インデックスがクエリをカバーできるように (state_id、city、address) にインデックスを付けることです:
ALERT TABLE userinfo ADD KEY state_id_2(state_id,city,address);
(注: state_id は既にインデックスがあります はい、前の概念によれば、これは重複インデックスではなく冗長インデックスです)
1. Shlomi Noach の common_schema のいくつかの試行を使用して、サーバーにインストールできる一般的に使用される一連のストレージと試行を見つけることができます。
2. Percona Toolkit の pt_duplicate-key-checker を使用すると、テーブル構造を分析して冗長なインデックスや重複したインデックスを見つけることができます。
以上がmysql の冗長インデックスと重複インデックスについての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。