2011-01-10 16 views
1

一連のURL(50000〜100000)とデータベーステーブルのレコードを20,000,000行に比較する必要があります。私は、データベースからのすべてのデータをハッシュにロードし、後で比較を行うことによってこれを行ういくつかのレガシーコードを持っています。これが機能している間、メモリ単位で改善する必要があります(速度は今のところ問題ではありません)。新しいデータと大規模データベースのレコードとの効率的な比較

私が検討している代替案は、入力データを(ドメインなどで)分割し、いくつかの選択をデータベースに行うことです。これはいくつかの入力に対しては機能するかもしれませんが、すべての入力に対してスケーリングされません。

もう1つの方法は、入力ごとにデータベースにクエリを行い、メモリにデータをロードしないことです。これは遅すぎるかもしれないと私は恐れている。

私はmysqlを使用しています。このような問題を経験した人は誰ですか?すべてのデータを別のシステム/ dbmsに移行することはオプションです。


+0

100k選択可能インデックスが適切に設定されていれば十分に速く形成されます。 – zerkms

+0

私たちはまっすぐなSQL照会でこれを行うことはできませんか? –

+0

これはオプションです。私はまずそれをやろうとし、それがどのように機能するかを見てみよう。私はちょうどこれを行うより効率的な方法があったのだろうかと思っていました。 – luis

答えて

2

入力ごとに照会することは問題になることはありませんよりも、あなたが列に索引を持っており、簡単なa = b比較を行っていると仮定。

このようなクエリは、インデックスを使用する場合は数ミリ秒を要しません。そのため、50.000のURLでは10分を超えてはなりません。

+1

うん、それは '='ではなく 'url IN(10-50-100 urls)'で比較することでスピードアップできます。 – zerkms

0


が大きなテーブルに列ROW_COUNTを追加し、(仮定が既に一意である)のURL欄に一意のキーを定義し

alter table big_table add column_row_count int(1) not null default 0; 
insert into big_table 
select all_columns, 0 from small_table 
on duplicate key set row_count=1; 

それらrow_count=1が重複したレコード

であるか、あなたがに興味はありません複製されたレコードが返ってくる

insert ignore ... 
関連する問題