3

research_words数億行のテーブルがあります。

毎日、数千万の新しい行を追加する必要があります。そのうちの約 5% はまったく新しい行であり、95% はその行のいくつかの列に追加する必要がある更新です。どれがどれかわからないので、次を使用します。

INSERT INTO research_words
  (word1,word2,origyear,cat,numbooks,numpages,numwords)
VALUES
  (34272,268706,1914,1,1,1,1)
ON DUPLICATE KEY UPDATE
  numbooks=numbooks+1,numpages=numpages+1,numwords=numwords+1

これは、主キーがオーバーしている InnoDB テーブルword1,word2,origyear,catです。

私が抱えている問題は、毎日新しい行を挿入する必要があり、毎日の行を挿入するのに24時間以上かかることです! 明らかに、その日の行を挿入するのに1日以上かかることはありません。挿入を高速化する方法を見つけなければなりません。

他のテーブルについては、ALTER TABLE ... DISABLE KEYS;andを使用して大きな成功を収めましたLOAD DATA INFILE。これにより、1 時間以内に数十億行を追加できます。残念ながら、このテーブルの列を増やしていることを除いて、それは素晴らしいことです。行を追加するために行が存在するかどうかを確認する必要があるため、キーを無効にすることが役立つとは思えません。

私のスクリプトは PHP ですが、行を追加するときは、PHPexecで送信するのではなく、MySQL を直接呼び出してコマンドのテキスト ファイルを渡します。この方法の方が高速だからです。

ここで速度の問題を解決するためのアイデアはありますか?

4

1 に答える 1

0

古い質問ですが、おそらく答える価値があります。この問題の一部は、多数の挿入が本質的に一度に 1 つずつ実行され、それぞれの後に一意のインデックスが更新されることに起因しています。これらの例では、挿入するn行を選択して一時テーブルに配置し、それらを目的のテーブルに結合したままにして、新しい値を計算することをお勧めします (OP の状況では IFNULL(dest.numpages+1,1) など)。 .) 次に、さらに 2 つのコマンドを実行します。挿入フィールドが 1 の場合の挿入と、それより大きい場合の更新です。更新はインデックスの更新を必要としないため、はるかに高速に実行されます。挿入には、同じ ON DUPLICATE KEY ロジックは必要ありません。

于 2016-05-04T23:01:14.580 に答える