詳しくはmysqlの中の冗長性と重複インデックスを理解します。

2527 ワード

mysqlは同じ列に複数のインデックスを作成することができます。意図的にも無意識的にも、mysqlは単独で重複インデックスを維持する必要があります。そして、最適化されたクエリを行う際にも、個別に検討する必要があります。これは性能に影響します。
重複インデックスとは、同じ列に同じ順序で作成された同じ種類の索引を指します。このように重複インデックスを作成することは避けなければなりません。発見後もすぐに削除するべきです。しかし、同じ列で異なる種類のインデックスを作成して、異なるクエリのニーズを満たすことができます。

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−Treeインデックスの冗長インデックスではなく、カバーされたインデックス列が何であるかに関係なく、B−Treeインデックスの冗長インデックスではない。
冗長インデックスは通常、テーブルに新しいインデックスを追加するときに発生します。例えば、拡張後のインデックス(A)ではなく、新しいインデックス(A,B)が追加されるかもしれない。もう一つの場合は、一つのインデックスを(A,ID)に拡張し、そのうちIDがメインキーであり、InnoDBにとっては、メインキーは二級索引に含まれているので、これも冗長性である。
多くの場合、冗長インデックスは必要ありません。新しいインデックスを作成するのではなく、既存のインデックスをできるだけ拡張するべきです。しかし、性能面では冗長インデックスが必要です。既存のインデックスを拡張することによって、他の検索性能に影響を与えます。例えば、整数列にインデックスがあると、長いvarrhar列を追加してインデックスを拡張する必要があると、性が急激に低下する可能性があります。特に、このインデックスをカバーインデックスとして検索したり、mysam表として検索したりする場合があります。(mysamのプレフィックス圧縮のため)
例えば、userinfo表があります。この表には100000個のデータがあります。ID値は約20000件の記録があります。state_idにはインデックスがあります。次にSQLをQ 1と呼びます。

SELECT count(*) FROM userinfo WHERE state_id=5; --Q1
クエリの実行速度を変更するのは、毎秒115回(QPS)です。
もう一つのSQLがあります。これをQ 2と呼びます。

SELECT state_id,city,address FROM userinfo WHERE state_id=5; --Q2
このクエリのQPSは10で、このインデックスの性能を向上させる最も簡単な方法は狂戦インデックスがid、city、address)、インデックスにクエリをカバーできるようにする:

ALERT TABLE userinfo ADD KEY state_id_2(state_id,city,address);
注:state_idはインデックスを持っています。以前の概念によると、インデックスを繰り返すよりも冗長インデックスです。
冗長インデックスと重複インデックスはどうやって探しますか?
1.Shlomi Noachのcomon_を使用することができます。schemaの中のいくつかの試みは位置を測りにきて、comon_schemaは、サーバーにインストールできる一連の一般的なストレージと試みです。
2.Perceona Toolkitのpt_を使用できます。duplicate-key-checkerは、テーブル構造を分析することによって冗長性と重複インデックスを見つける。
締め括りをつける
以上がmysqlの中の冗長性と重複インデックスのすべての内容についてです。興味のある方は、いくつかの比較的重要なMySQL変数RedisとMySQLの違いを簡単に説明します。MYSQLサブクエリとネストクエリの最適化例解析などを参照してください。もし足りないところがあれば、メッセージを歓迎します。