Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DBA 1年目で勉強になった DDL 3選

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for yoshikai yoshikai
October 05, 2025
110

DBA 1年目で勉強になった DDL 3選

Avatar for yoshikai

yoshikai

October 05, 2025
Tweet

Transcript

  1. 自己紹介 • yoshikai • 新卒2年目 • DBA 歴1年 • 昨年の今頃

    MySQL 運用・管理[実践] 入門 を読み終えたくらい • 関連リンク • X:https://x.com/yo__tsu__o • ブログ:https://hiyochic.hatenablog.com/
  2. 今日の内容 • VARCHAR カラムサイズの拡張 • https://hiyochic.hatenablog.com/entry/2025/09/08/100620 • CHANGE/MODIFY COLUMN •

    https://hiyochic.hatenablog.com/entry/2025/09/16/122840 • CHARACTER SET utf8mb3 -> utf8mb4 • https://hiyochic.hatenablog.com/entry/2025/09/22/125349
  3. DDL とその実行方式 • DDL (Data Definition Language) • データベースやテーブルなど、スキーマの構造を定義・変更する SQL

    • ALTER TABLE, CREATE TABLE, DROP TABLE, CREATE INDEX, … • ALTER TABLE 実行方式(ALGORITHM) • INSTANT:メタデータの変更のみで非常に高速(テーブルサイズに依らない) • INPLACE:多くの場合並列に DML を実行可能で テーブルサイズに応じた時間がかかることもある • COPY:並列に DML を実行できず、テーブルサイズに応じた時間がかかる • 参考 • https://zenn.dev/levtech/articles/226fcb30e99e70 • https://zenn.dev/levtech/articles/25462f51c9ffcb
  4. 今日の内容 • VARCHAR カラムサイズの拡張 • https://hiyochic.hatenablog.com/entry/2025/09/08/100620 • CHANGE/MODIFY COLUMN •

    https://hiyochic.hatenablog.com/entry/2025/09/16/122840 • CHARACTER SET utf8mb3 -> utf8mb4 • https://hiyochic.hatenablog.com/entry/2025/09/22/125349
  5. VARCHAR カラムサイズの拡張 • 255byte(文字数ではない)を跨ぐかどうか注意 • 255byte を跨ぐ:ALGORITHM=COPY • 255byte を跨がない:ALGORITHM=INPLACE,

    LOCK=NONE • VARCHAR カラムのデータ • prefix (文字列の byte 長) + 文字列 • 文字列 byte 長が 0 ~ 255 byte -> prefix が 1byte • 文字列 byte 長が 256 ~ 65535 byte -> prefix が 2byte • オンライン DDL のドキュメントの表(Extending VARCHAR column size) • In Place:Yes • Permits Concurrent DML: Yes • MySQL :: MySQL 8.4 Reference Manual :: 17.12.1 Online DDL Operations
  6. VARCHAR カラムサイズの拡張 – 動作確認 • VARCHAR(10) -> VARCHAR(20) (40byte ->

    80byte) • VARCHAR(63) -> VARCHAR(64) (252byte -> 256byte) >ALTER TABLE p MODIFY COLUMN name VARCHAR(20) COLLATE utf8mb4_bin NOT NULL, ALGORITHM=INPLACE, LOCK=NONE; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 >ALTER TABLE p MODIFY COLUMN name VARCHAR(64) COLLATE utf8mb4_bin NOT NULL, ALGORITHM=INPLACE, LOCK=NONE; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
  7. 今日の内容 • VARCHAR カラムサイズの拡張 • https://hiyochic.hatenablog.com/entry/2025/09/08/100620 • CHANGE/MODIFY COLUMN •

    https://hiyochic.hatenablog.com/entry/2025/09/16/122840 • CHARACTER SET utf8mb3 -> utf8mb4 • https://hiyochic.hatenablog.com/entry/2025/09/22/125349
  8. CHANGE/MODIFY COLUMN • 意図しない変更が発生しないか注意 • SHOW CREATE TABLE などで現在のカラム定義を確認 •

    変更する部分・変更しない部分全てを ALTER TABLE に含める • 変更内容によっては思わぬ事故につながる • いつの間にか NOT NULL が DEFAULT NULL に • INPLACE で実行できると思っていたら COPY だった
  9. CHANGE/MODIFY COLUMN – 動作確認 (1) • 文字数だけ 10 -> 20

    に変えたい! • -> NOT NULL が消える // ALTER TABLE 実行前 `col1` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, // ALTER TABLE 実行 >ALTER TABLE t1 modify column col1 varchar(20), ALGORITHM=INPLACE, LOCK=NONE; Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: // ALTER TABLE 実行後 `col1` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL,
  10. CHANGE/MODIFY COLUMN – 動作確認 (2) • 文字数だけ 10 -> 20

    に変えたい • -> CHARACTER SET/COLLATION がデフォルトのものに変更 & ALGORITHM=COPY // ALTER TABLE 実行前 >show create table t1¥G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id` int NOT NULL AUTO_INCREMENT, … `col3` varchar(10) CHARACTER SET ascii COLLATE ascii_bin DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
  11. CHANGE/MODIFY COLUMN – 動作確認 (2) • 文字数だけ 10 -> 20

    に変えたい • -> CHARACTER SET/COLLATION がデフォルトのものに変更 & ALGORITHM=COPY // ALTER TABLE 実行前 `col3` varchar(10) CHARACTER SET ascii COLLATE ascii_bin DEFAULT NULL, // ALTER TABLE 実行 >ALTER TABLE t1 modify column col3 varchar(20), ALGORITHM=INPLACE, LOCK=NONE; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY. >ALTER TABLE t1 modify column col3 varchar(20), ALGORITHM=COPY; Query OK, 2 rows affected (0.02 sec) Records: 2 Duplicates: 0 Warnings: 0 // ALTER TABLE 実行後 `col3` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL,
  12. 今日の内容 • VARCHAR カラムサイズの拡張 • https://hiyochic.hatenablog.com/entry/2025/09/08/100620 • CHANGE/MODIFY COLUMN •

    https://hiyochic.hatenablog.com/entry/2025/09/16/122840 • CHARACTER SET utf8mb3 -> utf8mb4 • https://hiyochic.hatenablog.com/entry/2025/09/22/125349
  13. CHARACTER SET utf8mb3 -> utf8mb4 • utf8mb3 と utf8mb4 •

    utf8mb3 は最大3byte、utf8mb4 は最大4byteで文字を表現 • utf8mb4 では や といった補助文字もサポート • Converting a character set • In Place: No, Permits Concurrent DML: No • 以下の条件を満たすとき CHARACTER SET の MODIFY を メタデータ変更のみの INPLACE 操作として実行できる • データ型が CHAR、VARCHAR、TEXT、ENUM • utf8mb3 から utf8mb4 への変更、または任意の CHARACTER SET から binary への変 更 • 変更対象のカラムにインデックスが貼られていない • 参考 • MySQL :: The MySQL 8.0.14 Maintenance Release is Generally Available • MySQL :: MySQL 8.4 Reference Manual :: 15.1.9 ALTER TABLE Statement
  14. CHARACTER SET utf8mb3 -> utf8mb4 – 動作確認 (1) • utf8mb3

    から utf8mb4 への CONVERT • テーブルサイズに応じた時間がかかるが INPLACE で実行可能 >ALTER TABLE t1 CONVERT TO CHARACTER SET utf8mb4, ALGORITHM=INPLACE, LOCK=NONE; Query OK, 0 rows affected (6.37 sec) Records: 0 Duplicates: 0 Warnings: 0
  15. CHARACTER SET utf8mb3 -> utf8mb4 – 動作確認 (2) • utf8mb3

    から utf8mb4 への MODIFY • INPLACE で実行可能 & メタデータの変更のみでほとんど時間がかからない • さらに、MODIFY 後の CONVERT もほとんど時間がかからない // まずは column 単位で character set を変更する >ALTER TABLE t1 MODIFY COLUMN col1 varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, ALGORITHM=INPLACE, LOCK=NONE; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 // MODIFY 後に CONVERT する >ALTER TABLE t1 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, ALGORITHM=INPLACE, LOCK=NONE; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0
  16. CHARACTER SET utf8mb3 -> utf8mb4 – 動作確認 (3) • VARCHAR

    で 255 byte 跨ぐことになる場合 • ALGORITHM=COPY • index が貼られている場合 • ALGORITHM=COPY // VARCHAR(80) (utf8mb3: 240 byte, utf8mb4: 320 byte) >ALTER TABLE t1 MODIFY COLUMN col1 varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, ALGORITHM=INPLACE, LOCK=NONE; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY. >ALTER TABLE t1 MODIFY COLUMN col1 varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, ALGORITHM=INPLACE, LOCK=NONE; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
  17. CHARACTER SET utf8mb3 -> utf8mb4 INPLACE 実行時間 CONVERT TO Yes

    テーブルサイズによる MODIFY Yes 一瞬 MODIFY 後 CONVERT Yes 一瞬 VARCHAR 255 byte 跨ぎ MODIFY No テーブルサイズによる VARCHAR 255 byte 跨ぎ MODIFY 後 CONVERT Yes 一瞬 index あり MODIFY No テーブルサイズによる index あり MODIFY 後 CONVERT No テーブルサイズによる
  18. 今日の内容まとめ • VARCHAR カラムサイズの拡張 • 255byte(文字数ではない)を跨ぐかどうか注意 • 255byte を跨ぐ:ALGORITHM=COPY •

    255byte を跨がない:ALGORITHM=INPLACE, LOCK=NONE • CHANGE/MODIFY COLUMN • 意図しない変更が発生しないか注意 • SHOW CREATE TABLE などで現在のカラム定義を確認 • 変更する部分・変更しない部分全てを ALTER TABLE に含める • CHARACTER SET utf8mb3 -> utf8mb4 • 意図した ALGORITHM を必ず指定する! • ALGORITHM=INSTANT • ALGORITHM=INPLACE, LOCK=NONE