フィールドを一意にすると、インデックスが作成されますか?


10

uniqueフィールドに制約を課す場合、スケーラブルな挿入時間を得るために、そのフィールドにインデックスを作成する必要もありますか?または、これは私のために行われますか?

具体的には、私はプロトタイピングのためにApache Derbyを使用していますが、おそらく近い将来にMySQLに移行する予定です。また、SQL標準にこれについて何かを述べている何かがあるといいのですが。

このフィールドで検索する必要がないので、役に立たないインデックスを作成したくありません。しかし、私はO(n)挿入時間よりも役に立たないインデックスが欲しいです。


2
私が知っていることから、一意の制約は一意のインデックスを使用して実装されています。あなたはこの質問でこの状況に関するいくつかの意見を見ることができます:一意のインデックスの代わりに一意の制約をいつ使用するのですか?
マリアン

@Marianはそのリンクをありがとう。とても洞察に満ちていました。
corsiKa、2011年

回答:


2

-編集-

私の元の回答(下記)は、unique制約の問題を扱っていないため、おそらくまったく役に立たないでしょう。他の人が言ったように、これらの制約は通常、暗黙の一意のインデックスで実装されます。特殊なケースでは、これは当てはまらない場合があります(disable novalidateOracleなど)。

問題は、インデックスなしで一意性を強制することは可能ですか?一般的に言って答えはノーですが、場合によってはクラスター化インデックスは、インデックスとテーブルが同じオブジェクトであることを意味します。

-編集の終了-

「O(n)挿入時間よりも役に立たないインデックスが欲しい」とおっしゃいましたが、一般的に、データベースにはO(n)挿入時間はありません。考慮すべき2つのケースがあります。

  1. インデックス付きまたはインデックスなしの通常のテーブル:

    新しい行はヒープの上部にダンプされます。RDBMSはおそらく1つのブロックしか調べないため、O(1)だけでなく、非常に小さなO(1)も調べます。

    テーブルにインデックスがある場合、行へのポインタがインデックスに追加されます。これは通常、O(log(n))操作になります。

  2. ある種のクラスタリングが行われているテーブル。たとえば、Oracleのインデックス構成テーブルまたはクラスタ、SQL Serverのクラスタ化インデックスなどです。

    新しい行が分割またはオーバーフローにブロックを引き起こす可能性があり、特定のブロックに挿入し、それは依然としてO(ログ(N))以上である起こる何されているより良いブロックを見つけるために使用される、Bツリー又は類似の構造に起因します。


ただし、インデックスなしの一意性O(n)は、テーブル全体をチェックする必要があるためです。それは私が避けようとしていることです。
corsiKa

これは確かにこの質問の最良の答えです!!! +1
RolandoMySQLDBA、2011年

@トリック-はい、私は最初に誤解しました。インデックスは、私が恐れている一意性の制約に対して支払う価格です。あなたのケースでクラスター化インデックスを使用できますか?
ジャックは、2011年

1
@JackPDougless標準の「インデックス」を使用して、O(lg n)挿入時間を取得できます。問題ない。私の質問は、適切な挿入時間を取得するためにそのインデックスが必要であることを知っているシステムがインデックスを作成することです。
corsiKa

2

主キー> =一意> =インデックス==キー

InnoDBデータはPKによって注文されます。MyISAM PKはUNIQUEと同じように機能します。

INSERTは、(あらゆる種類の)すべてのインデックスに「行」を追加する必要があります。これには時間がかかります。(通常、問題を起こすのに十分な時間ではありません。)インデックスはすべてBTree形式で保存されます。MyISAM BTreeブロックは1KBです。InnoDBは16KBを使用します。

InnoDBに挿入すると、PKとデータが同時に更新されます。

MyISAMに挿入すると、通常、データが.MYDに「追加」されます。それとは別に、PK(存在する場合)に行を追加します。

INSERTは最初に、PRIMARYキーまたはUNIQUEキーの重複キーがないことを確認する必要があります。これは、インデックスを使用して行われます。そして、それゆえに、なぜUNIQUEとFOREIGN KEY CONSTRAINTが実際にインデックスを構築するのか。これはO(logN)ですが、効率的なキャッシングを行うため、通常はI / OではなくCPUです。


InnoDB仕様にUNIQUE、ユーザーが作成するインデックスを指定せずに制約によってインデックスが作成されると記載されている引用はありますか?
corsiKa

うーん...いいえ、ちょうど数年の経験。
リックジェームズ

そして、それをテストする方法があります...セカンダリインデックスなしでテーブルを作成します。SHOW TABLE STATUSを実行-Index_lengthは0になります。次にUNIQUEインデックスを追加します。TABLE STATUSに何かが表示されます。(表に重要な量のデータを入れなければならない場合があります。)
リックジェームズ

1

太字の質問に回答するには:はい、フィールドを一意にすると、主キーのようにインデックスが作成されます。実際、これは、他の一意の(候補)キーと区別するために、独自の名前を持つ主キーに関する別の質問でこれについて説明しました。

制約に関しては、制約パラダイムが設定されるようにインデックスが作成されます。作成した制約が、制約パラダイムとは別に個人的に作成した他のUNIQUEキーを参照しない限り、重複するインデックスを削除できるはずです。

このフィールドを検索する必要はないかもしれませんが、MySQLはキーの有効性を決定し、ON DELETE CASCADEおよびON UPDATE CASCADE操作の実行方法を決定するためのパスとして必ず実行する必要があります。

UNIQUEインデックスは、テーブルのすべての行のタプル(シングルトン、ペア、トリプレット、...、nタプルなど)の一意性を保証するだけです。

テーブルに必要な制約パラダイムを破らない限り、そのような重複したインデックスを削除するのは自由裁量です。


1
これは私の質問に答えません。私の質問は挿入時間に関連しています。一意の制約がある場合、システムは挿入前にフィールドの一意性を確認する必要があります。フィールドにインデックスがない場合は、テーブル全体を検索する必要があります(O(n))。インデックスがある場合、検索ははるかに高速になります(おそらくO(lg n))。それが私の問題です。私は参照整合性のメカニズムをよく知っています。私は(この質問のために)パフォーマンスについてのみ懸念しています。
corsiKa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.