という名前の 2 つのテーブルがcsv (a csv dump)
あり、items (primary data table)
それぞれ 7M (csv ダンプ) と 15M 行があります。items
table に存在する列を更新する必要がありますcsv
。
両方のテーブルには、共通のインデックス付き結合 ID (a VARCHAR(255)
) があります。
相互 ID 列 (インデックス付き) の結合を含む UPDATE クエリは、実行に数日かかります。それを調査した後、非効率なのはMySQLがテーブルをスキャンし、csv
テーブルに対して行ごとのランダムアクセスクエリを作成することにあると思いitems
ます。
インデックスがあっても、それらのインデックスはメモリに収まらないため、必要な 7M のランダム アクセス クエリは急降下性能です。
この種の問題に対処する「典型的な」方法はありますか?
アップデート:
基本的に、「アイテム」の複数のカタログを取得し、それらを
items
テーブルに格納しています (これは、説明のために少し単純化しています)。たとえば、10 個のカタログのそれぞれに 700 万個のアイテムが含まれます (アイテム テーブルの 1 行に正規化したカタログ間で重複するものもあります)。これら 10 個のカタログの変更を毎日比較および検証する必要があります (UPDATES
2 つの大きなテーブル間の結合、またはその他のメカニズムを使用)。実際には
items
テーブルとitems_map
テーブルがありますが、ここでその追加レベルの抽象化について説明する必要はありません。csv
ダンプ テーブルとテーブルの間で更新を実行する方法を見つけたいと思いitems
ます (両方のテーブルでインデックス化された共通の ID が両方にある場合)。ただし、items
テーブルに 20M 行があり、csv
テーブルに 7M 行があるとします。この場合、インデックスはメモリに収まらず、ランダム シークでドライブを叩いていると思います