8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

2025年現在、企業の本番環境で広く使用されているMySQL 8.0。
MySQL 8.4 がリリースされた現在でも、多くの本番環境では8.0系が稼働しており、8.0の知識は依然として重要です。

この記事では、MySQL 8.0で追加・強化された注目の機能を、公式リファレンスに基づいて紹介します。

  • 特に以下の方におすすめです:
    • 8.0の初歩を体系的に学びたい方
    • MySQL 8.0で新たにデータベース開発を始める方
    • MySQL 5.7から8.0へのアップグレードを検討している方

新機能

1. ウィンドウ関数

8.0で追加され、データ分析系業務には必須級となったウィンドウ関数(Window Functions)。
ランキング・移動平均・累積計算などがSQLだけで実装できます。

SELECT
  user_id,
  points,
  RANK() OVER (ORDER BY points DESC) AS rank
FROM
  user_points;

2. CTE(WITH句)と再帰クエリ

「WITH句」による共通テーブル式(CTE)、さらに再帰CTEがサポートされ、
ツリー構造データの展開や、複雑なサブクエリの可読性UPに役立ちます

WITH RECURSIVE org_chart AS (
  SELECT id, manager_id, name FROM employees WHERE manager_id IS NULL
  UNION ALL
  SELECT e.id, e.manager_id, e.name
  FROM employees e
  INNER JOIN org_chart o ON e.manager_id = o.id
)
SELECT * FROM org_chart;

3. JSONサポートの拡充

MySQL 5.7からJSON型は使えましたが、8.0ではJSON_TABLE()関数など
より高度なJSON操作が可能になりました
RDBとNoSQLの“いいとこ取り”ができます

SELECT *
FROM JSON_TABLE(
  '[{"id":1,"name":"A"},{"id":2,"name":"B"}]',
  '$[*]' COLUMNS(id INT PATH '$.id', name VARCHAR(100) PATH '$.name')
) AS jt;

4. デフォルト文字コードが utf8mb4 に

8.0系からutf8mb4がデフォルトになり、
4バイト文字(絵文字など)も正しく格納できるようになりました。

5. インビジブルインデックス(Invisible Indexes)

一時的にインデックスを「非活性」にできるインビジブルインデックスが追加され、
パフォーマンス検証やインデックスの段階的廃止が容易になりました

ALTER TABLE my_table ALTER INDEX idx_sample INVISIBLE;

6. セキュリティ強化とロール管理

「ロール(Roles)」によるユーザー権限の一括管理、
パスワード強度・有効期限管理の強化など、運用・セキュリティ面も進化しました。

といっても、イメージつきにくいので以下に例を挙げておきます。

ロール管理

-- 開発者用ロールを作成
CREATE ROLE 'app_developer', 'app_read_only';

-- ロールに権限を付与
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_developer';
GRANT SELECT ON myapp.* TO 'app_read_only';

-- ユーザーを作成してロールを割り当て
CREATE USER 'tsubasa'@'%' IDENTIFIED BY 'secure_password123!';
GRANT 'app_developer' TO 'tsubasa'@'%';

-- ロールを有効化
SET DEFAULT ROLE 'app_developer' TO 'tsubasa'@'%';

パスワード管理の強化例

-- パスワード強度要件を設定
SET GLOBAL validate_password.policy = STRONG;
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.number_count = 2;

-- パスワード有効期限を設定(90日)
CREATE USER 'temp_user'@'%' 
IDENTIFIED BY 'SecurePass123!' 
PASSWORD EXPIRE INTERVAL 90 DAY;

-- パスワード履歴管理(過去5回のパスワードは再利用不可)
ALTER USER 'app_user'@'%' PASSWORD HISTORY 5;

アカウントロック機能

-- 連続ログイン失敗でアカウントロック
CREATE USER 'secure_user'@'%' 
IDENTIFIED BY 'SecurePass123!'
FAILED_LOGIN_ATTEMPTS 3 
PASSWORD_LOCK_TIME 2;  -- 2日間ロック

7. テーブルの生成・変更の即時DDL(Instant DDL)

多くのテーブル構造変更(ADD COLUMN等)がノンブロッキング(即時DDL)で行えるようになり、
大規模DBでも運用性がUPしました。

※Instant DDLは「カラム追加」など一部の操作のみノンブロッキングで、すべてのDDL操作が即時対応ではない点に注意が必要です。

おわりに

MySQL 8.0は現場で多く活用されており、新機能によって開発・運用・セキュリティ・データ分析の幅が大きく広がりました。
移行や新規設計の際は、8.0の新機能を積極的に使うことで、現代的なデータベース設計・運用が可能です。

詳細・最新情報は必ず公式リファレンスをチェックしてください。

参照

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?