mysqlのインデックスが多すぎますか?


83

現在のデータベースの最適化に時間を費やしています。

私は特にインデックスを見ています。

いくつかの質問があります:

  • インデックスが多すぎるということはありませんか?
  • インデックスは何をスピードアップしますか?
  • インデックスは何を遅くしますか?
  • インデックスを追加するのはいつ良い考えですか?
  • インデックスを追加するのはいつ悪い考えですか?
  • 複数のインデックスと複数列のインデックスの長所と短所は?

回答:


150

インデックスは何をスピードアップしますか?

データ検索-SELECTステートメント。

インデックスは何を遅くしますか?

データ操作-INSERT、UPDATE、DELETEステートメント。

インデックスを追加するのはいつ良い考えですか?

より良いデータ検索パフォーマンスが必要だと感じた場合。

インデックスを追加するのはいつ悪い考えですか?

大量のデータ操作が発生するテーブル(挿入、更新...)

複数のインデックスと複数列のインデックスの長所と短所は?

クエリは、カバーするインデックス(複数の列のインデックス)を処理するときに、インデックス列定義の左から右への列の順序に対処する必要があります。ステートメントの列の順序は重要ではなく、列1、2、および3の順序のみです。インデックスを使用する前に、ステートメントに列1への参照が必要です。列2または3への参照しかない場合、1/2/3のカバーインデックスは使用できません。

MySQLでは、クエリのSELECT /ステートメントごとに使用できるインデックスは1つだけです(サブクエリなどは個別のステートメントと見なされます)。また、MySQLで許可されるテーブルあたりのスペースの量には制限があります。さらに、インデックス付きの列で関数を実行すると、インデックスが役に立たなくなります-IE:

WHERE DATE(datetime_column) = ...

11
うわー、この情報は本当に驚くほどよく構成されており、非常に役立ちます!そして、私にとって最も役に立ったのは、関数が適用されるインデックスが役に立たないことでした...この回答に感謝します!
クリス

2
@OMG、最後の段落に関して、selectインデックスのマージにより、1つにつき複数のインデックスを使用できます。percona.com/blog/2012/12/14/...
Pacerier

1
-1は、(1)「SELECT」のみを高速化し、「WHERE」条件に従ってインデックスが正しく作成されている場合、SELECT、UPDATE、およびDELETEクエリを高速化しますが、データ操作時にインデックスを更新する必要があります。 INSERTクエリのみが(すべての場合で)インデックスなしよりも遅くなり、(2)MySQLは一度に1つのインデックスしか使用できないと言っています。
Patrick Allaert 2017

@PatrickAllaert -1アップデートに関する情報を誤解を招くため、削除と同じ
Eimsas

64

私はこの質問に対するいくつかの答えに同意しません。

インデックスが多すぎるということはありませんか?

もちろん。どのクエリでも使用されないインデックスを作成しないでください。冗長なインデックスを作成しないでください。pt-duplicate-key-checkerpt-index-usageなどのツールを使用して、不要なインデックスを見つけてください。

インデックスは何をスピードアップしますか?

  • WHERE句の検索条件。
  • 結合条件。
  • ORDERBYのいくつかのケース。
  • GROUPBYのいくつかのケース。
  • 一意の制約。
  • FOREIGNKEY制約。
  • 全文検索。

他の回答では、インデックスが多いほどINSERT / UPDATE / DELETEが遅くなるとアドバイスされています。それは本当ですが、UPDATEとDELETEの多くの使用法にもWHERE句があり、MySQLではUPDATEとDELETEもJOINをサポートしていることを考慮してください。インデックスは、インデックス更新のオーバーヘッドを補う以上に、これらのクエリに役立つ可能性があります。

また、InnoDBは、UPDATEまたはDELETEの影響を受ける行をロックします。彼らはこれを行レベルのロックと呼んでいますが、実際にはインデックスレベルのロックです。検索を絞り込むためのインデックスがない場合、InnoDBは、変更する特定の行よりもはるかに多くの行をロックする必要があります。テーブル内のすべての行をロックすることもできます。これらのロックは、論理的に競合していなくても、他のクライアントによる変更をブロックします。

インデックスを追加するのはいつ良い考えですか?

上記のいずれかの場合にインデックスの恩恵を受けるクエリを実行する必要があることがわかっている場合。

インデックスを追加するのはいつ悪い考えですか?

インデックスが別の既存のインデックスの左プレフィックスである場合、またはインデックスが実行する必要のあるクエリのいずれにも役立たない場合。

複数のインデックスと複数列のインデックスの長所と短所は?

場合によっては、MySQLはインデックスマージの最適化を実行し、独立したインデックス検索の結果を結合または交差させることができます。ただし、単一のインデックスを定義するとパフォーマンスが向上するため、インデックスのマージを行う必要はありません。

コンサルティングの顧客の1人のために、インデックスがない多対多のテーブルに複数列のインデックスを定義し、結合クエリを9,400万倍改善しました。

適切なインデックスの設計は、最適化する必要のあるクエリに基づいた複雑なプロセスです。「すべてにインデックスを付ける」や「更新の速度を落とさないように何もインデックスを付けない」などの幅広いルールを作成しないでください。

私のプレゼンテーション「インデックスを設計する方法」も参照してください。


10
「... UPDATEとDELETEの多くの使用法にもWHERE句があり、MySQLではUPDATEとDELETEもJOINをサポートしていることを考慮してください。インデックスは、インデックス更新のオーバーヘッドを補うよりも、これらのクエリに役立つ可能性があります。」
ロブ・クレイグ

1
これは、更新と削除でwhere句を考慮したことに対する受け入れられた答えであるはずです。
レオナルドエミリオドミンゲス2018

1
これは正解です。正解とマークされたものは間違っています。
エイムズ

7

インデックスが多すぎるということはありませんか?

インデックスは、目前の問題(テーブル、アプリケーションが実行するクエリなど)によって通知される必要があります。

インデックスは何をスピードアップしますか?

SELECT。

インデックスは何を遅くしますか?

インデックスを更新する必要があるため、INSERTは遅くなります。

インデックスを追加するのはいつ良い考えですか?

アプリケーションに別のWHERE句が必要な場合。

インデックスを追加するのはいつ悪い考えですか?

一意性の制約を照会または適用するために必要ない場合。

複数のインデックスと複数列のインデックスの長所と短所は?

質問がわかりません。複数の列を含む一意性制約がある場合は、必ずそのようにモデル化してください。


4

インデックスが多すぎるということはありませんか?

はい。インデックスの作成を探しに出かけるのではなく、必要に応じて作成してください。

インデックスは何をスピードアップしますか?

インデックステーブル/ビューに対するクエリ。

インデックスは何を遅くしますか?

新しいレコードごとにインデックスを付ける必要があるため、インデックス付きテーブルに対するINSERTステートメントはすべて遅くなります。

インデックスを追加するのはいつ良い考えですか?

クエリが許容可能な速度で実行されていない場合。クラスタ化されたPKの一部ではないレコードでフィルタリングしている可能性があります。その場合、検索しているフィルタに基づいてインデックスを追加する必要があります(パフォーマンスが適切であると見なされる場合)。

インデックスを追加するのはいつ悪い考えですか?

あなたがそれのためにそれをするとき-すなわち、過度の最適化。

複数のインデックスと複数列のインデックスの長所と短所は?

改善しようとしているクエリによって異なります。


3

インデックスが多すぎるということはありませんか?

うん、すべてのものと同様に、インデックスが多すぎるとデータ操作が遅くなります。

インデックスを追加するのはいつ良い考えですか?

インデックスを追加することをお勧めするのは、クエリが遅すぎる場合(つまり、クエリの結合が多すぎる場合)です。この最適化は、パフォーマンスを微調整するために、ソリッドモデルを構築した後でのみ使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.