0

2 つのテーブルを持つ Mysql Innodb が与えられました。1 つは 1 億 1,700 万以上の行で、名前、住所、都市、州、郵便番号を含む 340 を超える列があります。2 番目のテーブルは、名前、住所、市区町村、州、郵便番号、電子メールを含む 1,700 万以上の行です。1 番目と 2 番目のテーブルのデータは追加または更新されません。各テーブルの ID には主キーがあります。他のインデックスは定義されていません。

最初に、1 億 1,700 万行以上のテーブルから連絡先テーブルを作成しました。このテーブルには、名前、住所、市区町村、州、および郵便番号だけが含まれており、大幅に小さくなっています。php スクリプトを作成して、1,700 万件以上のレコードからなる小さなテーブルの各行を使用して検索を実行し、連絡先テーブルで一致するものを見つけようとしました。見つかったら、ID とメールを別のテーブルに挿入します。1 回の検索に約 86 秒かかっていたため、キャンセルしました。1,700 万以上のレコードがあるため、完了するまでに永遠に時間がかかります。

これが私の検索クエリです:

q = "GB_contacts から ID を選択
WHERE LAST_NAME=\"$LAST\" および FIRST_NAME=\"$FIRST\" および MI=\"$MIDDLE\"
および ADDRESS=\"$ADDRESS\" および ZIP=\"$ZIP\"".

私の質問は、どうすればこれをより速く行うことができますか? 連絡先テーブルの名前、住所、および郵便番号にインデックスを作成する必要がありますか、または連絡先テーブルの各列にインデックスを作成する必要がありますか? mysql を使用してこれを行うより高速な方法はありますか? たくさんのさまざまなリソースを読みましたが、どれが最善の方法なのかわかりません。これらは非常に大きなテーブルであるため、何をしようとしても非常に長い時間がかかるため、専門家のアドバイスを得て、これを理解しようとして数日、数週間、数か月を無駄にしないようにしたいと考えています. 有益なアドバイスをありがとうございます。

4

2 に答える 2

1

これを行う最善の方法は、照合対象のフィールドにクラスター化インデックスを作成することです。この場合、郵便番号から始めて、姓または名のいずれかを先に入力することをお勧めします。姓は長いため、照合に時間がかかりますが、より明確であるため、行数が少なくなります。さらにマッチングを行います (どちらのパフォーマンスが優れているかをテストする必要があります)。ここでの戦略は、データベース全体を検索するのではなく、人々のポケットだけを見るように mysql に指示することです。これを行っている間、MySQL に絞り込みを開始するようにどこから指示するかを賢くする必要があります。テスト中は、EXPLAIN コマンドを使用することを忘れないでください。

于 2012-07-06T05:42:47.397 に答える
0

結合キーにインデックスが付けられている場合は、通常の結合を試しましたか。それほど時間はかかりません。

結合列にインデックスを作成できるのは一度だけです。

2 番目のステップは、返されたレコードを新しい連絡先テーブルにロードすることです。

于 2012-07-06T06:12:04.497 に答える