0

私は Rails プロジェクトを構築しており、一連のテーブルを含むデータベースを持っています..それぞれが 500k から 1M の行を保持しており、常に新しい行を作成しています。

プロジェクトの性質上、各作成の前に、テーブルを検索して (1 つのフィールドに対して) 重複を探す必要があるため、同じ行を 2 回作成することはありません。残念ながら、私のテーブルが大きくなるにつれて、これにはますます時間がかかっています。

検索対象の特定の文字列フィールドにインデックスを追加することで検索を最適化できると考えていましたが、インデックスを追加すると作成時間が長くなると聞きました。

したがって、私の質問は次のとおりです。インデックスが作成されたフィールドを含む行を見つけて作成することとのトレードオフは何ですか? フィールドにインデックスを追加すると、Model.find_by_name を使用してプログラムが高速になることはわかっていますが、行の作成がどれだけ遅くなるでしょうか?

4

1 に答える 1

2

インデックスを作成すると、エントリをインデックスに追加する必要があり、リソースが必要になるため、エントリの挿入が遅くなりますが、追加すると選択クエリが高速化されます。B-Tree は、索引付けされたサブジェクトの最初の X ユニットを索引付けするためです。整数がある場合は素晴らしいですが、テキスト検索は注意が必要です。次のようなクエリを実行すると

Model.where("name LIKE ?", "#{params[:name]}%")

選択が高速化されますが、次のようなクエリを使用する場合:

Model.where("name LIKE ?", "%#{params[:name]}%")

数百文字を超える可能性のある文字列全体を検索する必要があり、250 文字の長い文字列の最初の 8 単位にインデックスを付けても改善されないため、役に立ちません。それは一つのことです。でも、もう一つ……。

データベースは ruby​​ よりも重複を見つけるのに優れているため、UNIQUE INDEX を追加する必要があります。ソート用に最適化されており、この問題に対処するためのより短くてクリーンな方法は間違いありません! 当然のことながら、関連するモデルに検証を追加する必要もありますが、それはデータベースとのやり取りを許可する理由ではありません。

// インデックス速度について

http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

多くのオプションはありません。インデックスが1つしか必要ない場合、挿入速度の低下がそれほど大きくなるとは思いません! ただし、選択速度は比例して増加します。

于 2011-11-18T20:22:46.810 に答える