【MySQL/MariaDB】PhpMyAdminで重いALTER TABLEを実行したらタイムアウト?原因と確実な解決策
データ量が多いテーブルに対して ALTER TABLE(インデックスの追加や構造変更)を実行すると、PhpMyAdminの画面が止まったり、処理が途中で失敗したりすることがあります。
ALTER TABLE `xxxxxxxxxx` ADD FULLTEXT KEY `ft_address` (`address`);
タイムアウトの可能性(原因)
PhpMyAdmin経由での重いクエリが失敗する場合、主にWebレイヤーの制限時間(タイムアウト)に引っかかっています。原因として以下の3つが挙げられます。
- PHPの実行時間制限 (
max_execution_time):デフォルトでは30秒〜数分でPHPプロセスが強制終了します。 - Webサーバーのタイムアウト:NginxやApacheの設定時間を超えると、ブラウザ側に
504 Gateway Timeoutなどが返されます。 - ブラウザのネイティブタイムアウト:画面が「ぐるぐる」したまま応答がないと、ブラウザ側が通信を切断します。
※画面上にエラーが表示されても、MySQLの内部では処理が継続している可能性があるため、焦って再起動や再実行をしないよう注意が必要です。
タイムアウト時の対策(PHP等の設定変更)
サーバーの管理者権限があり、設定ファイルを変更できる場合は、一時的に制限時間を引き延ばすことで対応できます。
php.ini の修正
PHPの最大実行時間を引き上げます(例:10分に延長)。
$ sudo vim /etc/php.ini max_execution_time = 600 memory_limit = 512M
CUI(コマンドライン)での実行
最も確実で安全な対策は、Webレイヤーの制限を受けないCUIから直接SQLを実行することです。
ステップ1:現在のプロセスを確認する
前回の処理が裏に残っていないか、ロックが発生していないかを必ず確認します。
SHOW FULL PROCESSLIST;
State 列が altering table 等になっていなければ、以下の手順へ進みます
ステップ2:バッファサイズを拡張(高速化)
※このステップは必須ではありません。スキップしてもSQLは問題なく実行できます。
データ量が多く処理を少しでも早く終わらせたい場合は、この画面(セッション)の間だけ、ソート用のメモリを一時的に大きく割り当ててディスクへの書き込みを減らします。
-- 使用するDBを選択 USE データベース名; -- インデックス作成用のバッファを拡張(例: 256MB) SET SESSION innodb_sort_buffer_size = 268435456;
本番SQLの実行
ALTER TABLE `xxxxxxxxxx` ADD FULLTEXT KEY `ft_address` (`address`);
※MariaDB環境の場合、別ウィンドウで SHOW FULL PROCESSLIST; を実行すると、一番右の Progress 列で現在の進捗率(%)をリアルタイムに確認できます。

