という名前の 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 行があるとします。この場合、インデックスはメモリに収まらず、ランダム シークでドライブを叩いていると思います