それぞれに列を追加して、2000 個のテーブルを変更しようとしています。これを実現するには、C# で for ループを使用し、各テーブル名に対してクエリを実行して、持っている文字列のリストを取得します。最初は高速ですが、徐々に遅くなります。mysql.exe のメモリは、約 30 秒で 50k から 375k に増加します。なぜこれを行うのですか?テーブルの変更を 1 回行うと、メモリが再び低下するはずです。各変更後に一部のリソースが破棄されていませんか? キャッシュですか、それともバッファですか? ガベージコレクション?20 番目から 25 番目の変更テーブルの後で信じられないほど遅くなるため、この for ループを終了できません。
1545 次
1 に答える
3
alter table
MySQL にステートメントを発行すると、テーブルの再構築が開始されます。
次の手順を実行します。
old
テーブルを新しいファイルに コピーします。new
ファイル定義 .frm-file に列を追加しますnew
.myd-datafile のデータファイルに列を追加します。これには、データファイル全体を書き直す必要があります。- データファイルのすべての行を
new
調べて、新しい列にデフォルト値を入力します - 新しい列にインデックスがある場合、MySQL は .MYI-indexfile に対しても手順 2、3、4 を実行する必要があります。
old
データファイル の名前を変更しますnew
ファイルと同じ名前になるように、データファイルの名前を変更しold
ます。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 に答える