# MySQL のSQL
- スキーママイグレーション
- ALTER TABLE に代表されるような
- データマイグレーション
- DDL: Data Definition Language
- データ定義言語
- `ALTER`, `CREATE`, `DROP`, `TRUNCATE` など
- DML: Data Manipulation Language
- データ操作言語
- `DELETE`, `INSERT`, `SELECT`, `UPDATE` など
- DCL: Data Control Language
- データ制御言語
- `GRANT`, `REVOKE` など
## MySQL の Online DDL
MySQL には Online DDL がある。
これはDMLによる操作をブロックせずに実行できるため、ユーザ影響なしで使うことができます。
- 長時間のロックを回避:ALTER操作に伴うテーブルのロック時間を短縮しすることができます。
- 安全な変更:ロールバック可能
- リードレプリカでも利用可能:リードレプリカでも利用可能です。
DDLの発行時にALGORITHMを指定することができます。
Online DDL の恩恵を受けるには `INPLACE`, `INSTANT` を指定します。 `INSTANT` は内部のメタデータのみを書き換えるため非常に高速で動作します。
### 使用条件
全てのDDLでOnline DDLが利用できるわけでなく、以下の条件を満たす必要があります。
- ストレージエンジンがInnoDBであること
- インデックスを変更しないALTER操作であること
- ALTER操作に使用する列に対して、デフォルト値が定義されていること
- MySQLの設定ファイルで、`innodb_online_alter_log_max_size`パラメータを適切に設定していること
### おまじない
使用条件等がよくわからない場合は、ALTER時に `ALGORITHM=INPLACE, LOCK=NONE` を指定することで確認できます。 Online DDL が利用できない場合はエラーが起きて実行しなくなります。
```sql=
ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
```
Railsのデータベースマイグレーションでおまじないの付与は以下の様にするしかなさそうです。
```ruby=
class ChangeUsersTableComment < ActiveRecord::Migration
def up
execute "ALTER TABLE `users` COMMENT 'hello', ALGORITHM=INPLACE, LOCK=NONE"
end
def down
execute "ALTER TABLE `users` COMMENT '', ALGORITHM=INPLACE, LOCK=NONE"
end
end
```
#### LOCK
- [The LOCK clause]
| Value | Description |
| ----------- | -------------------------------------------------------------------------------------------------------- |
| `NONE` | クエリやDMLの同時実行を許可する |
| `SHARED` | 同時進行のクエリーは許可するが、DMLはブロック |
| `DEFAULT` | 可能な限りの並行性(並行クエリ、DML、またはその両方)を許可します。`LOCK` を省略した時の挙動になります。 |
| `EXCLUSIVE` | 並行するクエリやDMLをブロックします |
#### Workshop
- https://www.db-fiddle.com/f/jtKTNjvwVU7yd536tAVuhV/0
## Also see
- [InnoDB and Online DDL]
- [MySQL 8.0 の INSTANT DDL について – スマートスタイル技術ブログ]
- [MySQLのInstant ADD COLUMNをちゃんと調べてみる - y-asaba@hatenablog]
###### tags: `DB` `MySQL`
[InnoDB and Online DDL]: https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl.html
[MySQL 8.0 の INSTANT DDL について – スマートスタイル技術ブログ]:https://blog.s-style.co.jp/2018/09/2525/
[MySQLのInstant ADD COLUMNをちゃんと調べてみる - y-asaba@hatenablog]:https://y-asaba.hatenablog.com/entry/2018/12/21/002811
[The LOCK clause]:https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-performance.html