4

ローカル Mysql インスタンスの実行。DB で、列名のつづりを間違えました (stret to street)。だから私はクエリを書きました:

alter table address change Stret Street VARCHAR(20); 

このテーブルは作成されたばかりで、レコードが含まれていません。なぜそんなに時間がかかるのかを尋ねるさまざまなスレッドがあることは知っていますが、それらのテーブルにはすべて100,000行以上あります。私には何もない!このクエリに 1 時間 13 分 15.76 秒かかったのはなぜですか?

テーブルを削除して再作成することもできたはずですが、なぜこの「単純な」変更に時間がかかるのでしょうか?

編集:理由がわかりました。このデータベースを使用するプログラムをデバッグしていて、途中で(プログラムを終了せずに)停止して列名を変更しました。Tomcatを停止すると、すべてが再び瞬時になります。そのため、おそらくテーブルがロックされていたため、クエリが保留されていました。私はInnoDBを使用しています。みんな、ありがとう。

4

2 に答える 2

3

これを行う前に、削除されたがデータベースからバキュームされていない残りのデータをフラッシュするために、 (非常に高速ですが、列カウンターTRUNCATE TABLE addressをリセットします) または (少し遅くなりますが、データは変更しません) することができます。 .AUTO_INCREMENTOPTIMIZE TABLE address

別の方法としてCREATE TABLE _address LIKE address、クローンに変更を実行してから、使用するように_address切り替えaddressますRENAME TABLE

于 2013-02-08T19:30:22.333 に答える
2

ドキュメントからの引用

ほとんどの場合、ALTER TABLE は元のテーブルの一時的なコピーを作成します。MySQL は、テーブルを変更する他の操作を待ってから続行します。変更をコピーに組み込み、元のテーブルを削除し、新しいテーブルの名前を変更します。

InnoDB を使用している場合は、単一の列の名前変更でMyISAM上記を実行しますが、 を使用すると、コピーは作成されず、テーブルのfrmファイルが変更されます。これは、メモリの制約により、おそらく大きなテーブルの場合にかかる時間を説明します。

クエリ実行プランを取得してみてください。

于 2013-02-08T19:33:01.800 に答える