2

それぞれに列を追加して、2000 個のテーブルを変更しようとしています。これを実現するには、C# で for ループを使用し、各テーブル名に対してクエリを実行して、持っている文字列のリストを取得します。最初は高速ですが、徐々に遅くなります。mysql.exe のメモリは、約 30 秒で 50k から 375k に増加します。なぜこれを行うのですか?テーブルの変更を 1 回行うと、メモリが再び低下するはずです。各変更後に一部のリソースが破棄されていませんか? キャッシュですか、それともバッファですか? ガベージコレクション?20 番目から 25 番目の変更テーブルの後で信じられないほど遅くなるため、この for ループを終了できません。

4

1 に答える 1

3

alter tableMySQL にステートメントを発行すると、テーブルの再構築が開始されます。

次の手順を実行します。

  1. oldテーブルを新しいファイルに コピーします。
  2. newファイル定義 .frm-file に列を追加します
  3. new.myd-datafile のデータファイルに列を追加します。これには、データファイル全体を書き直す必要があります。
  4. データファイルのすべての行をnew調べて、新しい列にデフォルト値を入力します
  5. 新しい列にインデックスがある場合、MySQL は .MYI-indexfile に対しても手順 2、3、4 を実行する必要があります。
  6. oldデータファイル の名前を変更します
  7. newファイルと同じ名前になるように、データファイルの名前を変更しoldます。
  8. oldデータファイルを削除します

newパフォーマンス上の理由から、データとインデックス ファイルをメモリに保持しようとします。
これがメモリの増加です。
MySQL はしばらくの間テーブル データをメモリに保持し、キャッシュ スペースに割り当てられたメモリMy.iniが使い果たされた場合にのみキャッシュをクリアします。

次のコマンドを発行して、キャッシュをクリアできます。

RESET QUERY CACHE;

すべてのalter tableステートメントの後。

参照: http://dev.mysql.com/doc/refman/5.0/en/query-cache-status-and-maintenance.html
MySQL キャッシュの問題については、http: //www.docplanet.org/mysqlを参照してください。 /mysql-query-cache-in-depth/

于 2011-10-08T20:53:21.820 に答える