背景
既存のテーブルに複合主キーをつけようとmysqlで
mysql> ALTER TABLE users_exam_results ADD PRIMARY KEY (column1,column2,column3,column4,column5,column6);
をSQLで実行したのだが遅い遅い。。遅すぎる。
一向に終わりそうにないのでいっそのこと一旦キャンセルしたくなった
原因
そもそも遅い原因なのだが
ALTE TABLE の対象テーブルusers_exam_resultsにはすでに60万件ものデータが入っていた
これは流石にすぐには終わるわけないだろう。。
ローカルのテスト環境だったこともあり、一旦、このALTER TABLEの処理をキャンセルして、
テーブルの中身をbackupした上で、truncateで削除して中身を空にしてから、
ALTER TABLEをしようと思う
キャンセル手順
①プロセスの確認
mysql> show processlist;
+----+------+-----------+-------------+---------+------+----------------+------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+-------------+---------+------+----------------+------------------------------------------------------------------------------------------------------+
| 35 | root | localhost | test | Query | 269 | altering table | ALTER TABLE users_exam_results ADD PRIMARY KEY (column1,column2,column3,column4,column5 |
| 39 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+------+-----------+-------------+---------+------+----------------+------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
プロセスを確認したことで、
該当のALTER TABLEをしているプロセスのIDは 35ということがわかった
②プロセスをkill
あとは 以下のようにプロセスIDを指定してkillをする。
mysql> kill 35;
Query OK, 0 rows affected (0.00 sec)
そしたら別ウィンドウで開いてみていたmysqlの処理結果が以下のように変わった
mysql> ALTER TABLE users_exam_results ADD PRIMARY KEY (column1,column2,column3,column4,column5,column6);
ERROR 2013 (HY000): Lost connection to MySQL server during query
そして自分はphpmyadminを使っているのでそこからtruncateでテーブルの中身だけを削除し、
再度ALTER TABLEを実行
mysql> ALTER TABLE users_exam_results ADD PRIMARY KEY (column1,column2,column3,column4,column5,column6);
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 84
Current database: test
Query OK, 0 rows affected (0.30 sec)
その後
desc users_exam_detail;
でテーブル構成をみたら、無事keyにprimary keyがセットされていた