17

私は最近、SQLiteに適切なインデックスを与えることで、複雑なクエリを桁違いに高速化しました。このような結果から、JOINまたはORDERBY句に一般的に使用される他の多くのフィールドにインデックスを付ける必要があるかどうか疑問に思います。しかし、私は熱心になりすぎて逆効果になりたくありません。インデックスを作成しない理由がいくつかあるはずだと思います。そうしないと、すべてのフィールドがデフォルトでインデックスに登録されます。

この場合はSQLiteを使用していますが、もちろんDBMSに依存しないアドバイスも歓迎します。

4

4 に答える 4

41

インデックスは挿入と更新を遅くし(これはロックに関して非常に深刻な問題になる可能性があります)、ディスク容量を消費します。それはほとんどそれです。

于 2009-04-18T21:10:30.820 に答える
6

インデックスはディスクスペースを使用して保存し、作成と保守に時間がかかります。未使用のものは何のメリットもありません。クエリの候補インデックスが多数ある場合は、サーバーにクエリの「間違った」インデックスを選択させることで、クエリの速度が低下する可能性があります。

これらの要素を使用して、インデックスが必要かどうかを判断します。

通常、決して使用されないインデックスを作成することは可能です。たとえば、2つの可能な値しかない(nullではない)フィールドのインデックスは、ほぼ確実に役に立たないでしょう。

頻繁に実行されるアプリケーションが適切なインデックスを使用していることを確認し、必要以上のインデックスを作成しないように、独自のアプリケーションのクエリを説明する必要があります。

于 2009-04-18T21:12:01.457 に答える
6

特定のアプリケーションをテストするために、実行するクエリの前に「EXPLAIN QUERY PLAN」を配置して、結果を確認できます。インデックスを使用している場所と使用していない場所が表示されます。

そうすることで、より多くのインデックスを使用できる場所と、それらが違いをもたらさない場所を判断できます。

Sqliteの説明

SqliteSpyを使用して、問題を引き起こしていると思われるクエリをテストします。

于 2009-04-19T16:49:21.093 に答える
5

ディスクスペースのインデックスのコストは、一般的に取るに足らないものです。多くの場合、テーブルが変更されたときにインデックスを更新するための追加の書き込みのコストは中程度です。追加のロックのコストは厳しい場合があります。

これは、テーブルの読み取りと書き込みの比率、およびクエリを高速化するためにインデックスが実際に使用される頻度によって異なります。

于 2009-04-19T02:46:22.027 に答える