現在のデータベースの最適化に時間を費やしています。
私は特にインデックスを見ています。
いくつかの質問があります:
- インデックスが多すぎるということはありませんか?
- インデックスは何をスピードアップしますか?
- インデックスは何を遅くしますか?
- インデックスを追加するのはいつ良い考えですか?
- インデックスを追加するのはいつ悪い考えですか?
- 複数のインデックスと複数列のインデックスの長所と短所は?
回答:
インデックスは何をスピードアップしますか?
データ検索-SELECTステートメント。
インデックスは何を遅くしますか?
データ操作-INSERT、UPDATE、DELETEステートメント。
インデックスを追加するのはいつ良い考えですか?
より良いデータ検索パフォーマンスが必要だと感じた場合。
インデックスを追加するのはいつ悪い考えですか?
大量のデータ操作が発生するテーブル(挿入、更新...)
複数のインデックスと複数列のインデックスの長所と短所は?
クエリは、カバーするインデックス(複数の列のインデックス)を処理するときに、インデックス列定義の左から右への列の順序に対処する必要があります。ステートメントの列の順序は重要ではなく、列1、2、および3の順序のみです。インデックスを使用する前に、ステートメントに列1への参照が必要です。列2または3への参照しかない場合、1/2/3のカバーインデックスは使用できません。
MySQLでは、クエリのSELECT /ステートメントごとに使用できるインデックスは1つだけです(サブクエリなどは個別のステートメントと見なされます)。また、MySQLで許可されるテーブルあたりのスペースの量には制限があります。さらに、インデックス付きの列で関数を実行すると、インデックスが役に立たなくなります-IE:
WHERE DATE(datetime_column) = ...
select
インデックスのマージにより、1つにつき複数のインデックスを使用できます。percona.com/blog/2012/12/14/...
私はこの質問に対するいくつかの答えに同意しません。
インデックスが多すぎるということはありませんか?
もちろん。どのクエリでも使用されないインデックスを作成しないでください。冗長なインデックスを作成しないでください。pt-duplicate-key-checkerやpt-index-usageなどのツールを使用して、不要なインデックスを見つけてください。
インデックスは何をスピードアップしますか?
他の回答では、インデックスが多いほどINSERT / UPDATE / DELETEが遅くなるとアドバイスされています。それは本当ですが、UPDATEとDELETEの多くの使用法にもWHERE句があり、MySQLではUPDATEとDELETEもJOINをサポートしていることを考慮してください。インデックスは、インデックス更新のオーバーヘッドを補う以上に、これらのクエリに役立つ可能性があります。
また、InnoDBは、UPDATEまたはDELETEの影響を受ける行をロックします。彼らはこれを行レベルのロックと呼んでいますが、実際にはインデックスレベルのロックです。検索を絞り込むためのインデックスがない場合、InnoDBは、変更する特定の行よりもはるかに多くの行をロックする必要があります。テーブル内のすべての行をロックすることもできます。これらのロックは、論理的に競合していなくても、他のクライアントによる変更をブロックします。
インデックスを追加するのはいつ良い考えですか?
上記のいずれかの場合にインデックスの恩恵を受けるクエリを実行する必要があることがわかっている場合。
インデックスを追加するのはいつ悪い考えですか?
インデックスが別の既存のインデックスの左プレフィックスである場合、またはインデックスが実行する必要のあるクエリのいずれにも役立たない場合。
複数のインデックスと複数列のインデックスの長所と短所は?
場合によっては、MySQLはインデックスマージの最適化を実行し、独立したインデックス検索の結果を結合または交差させることができます。ただし、単一のインデックスを定義するとパフォーマンスが向上するため、インデックスのマージを行う必要はありません。
コンサルティングの顧客の1人のために、インデックスがない多対多のテーブルに複数列のインデックスを定義し、結合クエリを9,400万倍改善しました。
適切なインデックスの設計は、最適化する必要のあるクエリに基づいた複雑なプロセスです。「すべてにインデックスを付ける」や「更新の速度を落とさないように何もインデックスを付けない」などの幅広いルールを作成しないでください。
私のプレゼンテーション「インデックスを設計する方法」も参照してください。
インデックスが多すぎるということはありませんか?
インデックスは、目前の問題(テーブル、アプリケーションが実行するクエリなど)によって通知される必要があります。
インデックスは何をスピードアップしますか?
SELECT。
インデックスは何を遅くしますか?
インデックスを更新する必要があるため、INSERTは遅くなります。
インデックスを追加するのはいつ良い考えですか?
アプリケーションに別のWHERE句が必要な場合。
インデックスを追加するのはいつ悪い考えですか?
一意性の制約を照会または適用するために必要ない場合。
複数のインデックスと複数列のインデックスの長所と短所は?
質問がわかりません。複数の列を含む一意性制約がある場合は、必ずそのようにモデル化してください。
インデックスが多すぎるということはありませんか?
はい。インデックスの作成を探しに出かけるのではなく、必要に応じて作成してください。
インデックスは何をスピードアップしますか?
インデックステーブル/ビューに対するクエリ。
インデックスは何を遅くしますか?
新しいレコードごとにインデックスを付ける必要があるため、インデックス付きテーブルに対するINSERTステートメントはすべて遅くなります。
インデックスを追加するのはいつ良い考えですか?
クエリが許容可能な速度で実行されていない場合。クラスタ化されたPKの一部ではないレコードでフィルタリングしている可能性があります。その場合、検索しているフィルタに基づいてインデックスを追加する必要があります(パフォーマンスが適切であると見なされる場合)。
インデックスを追加するのはいつ悪い考えですか?
あなたがそれのためにそれをするとき-すなわち、過度の最適化。
複数のインデックスと複数列のインデックスの長所と短所は?
改善しようとしているクエリによって異なります。