0

という名前の 2 つのテーブルがcsv (a csv dump)あり、items (primary data table)それぞれ 7M (csv ダンプ) と 15M 行があります。itemstable に存在する列を更新する必要がありますcsv

両方のテーブルには、共通のインデックス付き結合 ID (a VARCHAR(255)) があります。

相互 ID 列 (インデックス付き) の結合を含む UPDATE クエリは、実行に数日かかります。それを調査した後、非効率なのはMySQLがテーブルをスキャンし、csvテーブルに対して行ごとのランダムアクセスクエリを作成することにあると思いitemsます。

インデックスがあっても、それらのインデックスはメモリに収まらないため、必要な 7M のランダム アクセス クエリは急降下性能です。

この種の問題に対処する「典型的な」方法はありますか?


アップデート:

基本的に、「アイテム」の複数のカタログを取得し、それらをitemsテーブルに格納しています (これは、説明のために少し単純化しています)。たとえば、10 個のカタログのそれぞれに 700 万個のアイテムが含まれます (アイテム テーブルの 1 行に正規化したカタログ間で重複するものもあります)。これら 10 個のカタログの変更を毎日比較および検証する必要があります ( UPDATES2 つの大きなテーブル間の結合、またはその他のメカニズムを使用)。

実際にはitemsテーブルとitems_mapテーブルがありますが、ここでその追加レベルの抽象化について説明する必要はありません。csvダンプ テーブルとテーブルの間で更新を実行する方法を見つけたいと思いitemsます (両方のテーブルでインデックス化された共通の ID が両方にある場合)。ただし、itemsテーブルに 20M 行があり、csvテーブルに 7M 行があるとします。

この場合、インデックスはメモリに収まらず、ランダム シークでドライブを叩いていると思います

4

1 に答える 1

0

さて、私はついにこのクエリをInnoDB専用の12 GBのRAMを備えた8コアボックスに入れました。それは完了しましたが、7時間後です。

私たちの解決策:このプロセスをMySQLから移行します。MapReduce(Hadoop)を使用して、大きなテーブル全体をフラットファイル形式で維持し、主要な更新プロセスを並行して実行し、最後にを使用LOAD DATA INFILEしてテーブルを1回すばやく(〜毎日)更新します。

于 2012-10-14T10:10:07.190 に答える