2017-06-27 6 views
1

新しい行を挿入するたびにインデックスを再構築する必要がありますか?多くの書き込み/挿入がデータベースインデックスに影響しますか?

そして、そのトークンによって、私がたくさん挿入していても、インデックスは常に再構築されているため、クエリには効果がない/役に立たないとは限りませんか?

私は、データベース設計の改善のためにこのデータベース理論のいくつかを理解しようとしています。

+1

インデックスに行を挿入することは、インデックスを再構築することとはまったく異なります。 –

答えて

1

はい、挿入すると効果がありますが、思うように悪くないです。リレーショナルデータベースのほとんどのエンティティと同様に、インデックスは通常、拡張に対応するために余分なスペースを確保して作成され、維持されます。インデックススペースがほとんどなくなると、通常はが自動的にに増加します。

インデックスの再構築は最初から開始され、インデックスへのエントリの追加とは異なります。新しい行を挿入すると、ではなく、がインデックスを再構築します。新しいエントリは、上記の余分なスペースに追加されます。ただし、クラスタリングされたインデックスは少し異なります。

DB管理者のほとんどは、「統計の更新」というタスクも実行します。このタスクは、クエリプランナが使用する内部統計セットを更新して、適切なクエリ戦略を策定します。メンテナンスの一環として実行されるこのタスクは、クエリオプティマイザを現在のインデックス状態で「調整」するのにも役立ちます。

データベースの仕組み、独立したサイトと主要データベースのサイト運営者の両方に、非常に多くの高品質なリファレンスがあります。あなたは文字通りデータベースの専門家になることからキャリアを作り出すことができます。しかし、インサートについて心配しないでください。 ;)疑問がある場合は、DBAに相談してください。

あなたの懸念に対応するのに役立ちますか?

1

インデックスを更新するたびにインデックス全体を再構築する必要はありません(挿入と削除も同様です)。

インデックスのエントリを更新するのに少しオーバーヘッドがありますが、コストはかなり低いです。ほとんどのインデックスは内部でB+Tree data structureとして保存されます。このデータ構造は、簡単に変更できるので選択されました。

MySQLにはさらにChange Bufferという最適化機能があります。このバッファは、変更をキャッシュすることによってインデックスを更新する際のパフォーマンスコストを削減するのに役立ちます。つまり、インデックスに影響を与えるINSERT/UPDATE/DELETEを実行し、変更のタイプが変更バッファに記録されます。次回クエリを使用してそのインデックスを読み取ると、MySQLは完全インデックスの補足の一種として変更バッファを読み取ります。

これは、「正誤表」を定期的に発行する公開された文書である可能性があります。文書の現状を理解するために、文書と正誤表の両方を一緒に読む必要があります。

最終的に、変更バッファ内のエントリは徐々にインデックスにマージされます。これは、次に文書を再印刷するときに、文書に編集中の正誤表に類似しています。

変更バッファは、2次インデックスにのみ使用されます。プライマリキーまたはユニークキーインデックスでは何も行いません。ユニークなインデックスの更新は延期することはできませんが、B +ツリーを使用しているためコストがかかりません。

OPTIMIZE TABLE、または一部のタイプのALTER TABLEの変更をインプレースで実行できない場合、MySQLはインデックスをゼロから再構築します。これは、たとえば、多くの表を削除した後に索引のデフラグを行う場合に便利です。

関連する問題