- 「MySQLは簡単」と言われる理由
- 最初は動く、そして後から壊れる
- データが増えた瞬間に起きること
- 制約を書かないと、何も守ってくれない
- 外部キーを使わない文化
- インデックスも自動では最適化されない
- ORMを使っても解決しない
- なぜ「簡単」が危険になるのか
- 対策:最低限やるべきこと
- まとめ
「MySQLは簡単」と言われる理由
MySQLについて調べると、ほぼ必ず「MySQLは簡単」という言葉に出会います。
インストールも容易で、チュートリアルも多く、PHPと組み合わせればすぐにWebアプリが動きます。
この評価自体は間違いではありません。
実際、初めてデータベースを触る人が最短で成果を出しやすいのはMySQLです。
しかし、問題はその先です。
“簡単に始められる”と“簡単に運用できる”は別物です。
多くのトラブルは、この誤解から始まります。
最初は動く、そして後から壊れる
MySQLは初期設定でも動きます。
極端な話、次のSQLだけでもアプリは作れます。
CREATE TABLE users ( id INT, name VARCHAR(50) );
INSERTも通ります。
INSERT INTO users VALUES (1, 'taro'); INSERT INTO users VALUES (1, 'jiro');
ここで問題は発生しません。
主キーも制約もないため、DBは何も言いません。
そして開発は進みます。
ログイン機能、一覧画面、検索機能が実装されます。
問題が出るのは運用開始後です。
データが増えた瞬間に起きること
数万件、数十万件とデータが増えると、次のような現象が起きます。
- 同じユーザーが複数存在する
- 更新が反映されない
- 検索結果が不安定
- 集計結果が合わない
アプリのバグに見えますが、原因は設計です。
MySQLが悪いわけではありません。
MySQLは「制約を書かなければ、制約を課さない」データベースです。
つまり、次のようなテーブルは成立します。
- 主キーがない
- 外部キーがない
- NOT NULLがない
そして最初は動きます。
ここが危険な点です。
制約を書かないと、何も守ってくれない
例えば会員テーブルです。
CREATE TABLE users ( email VARCHAR(255), password VARCHAR(255) );
このテーブルでは、次のデータも保存できます。
- 同じメールアドレスが複数登録
- 空文字のメール
- NULLのパスワード
アプリ側で防いでいるつもりでも、バグや例外経路で必ず漏れます。
そしてデータ不整合になります。
MySQLは沈黙します。
エラーを出さないからです。
「簡単」という評価の裏側はここにあります。
何もしなくても動くが、何も守ってくれないのです。
外部キーを使わない文化
歴史的に、MySQLのシステムでは外部キー制約を使わない例が多くありました。
理由は単純で、昔のMyISAMでは使えなかったからです。
その名残で、現在でもアプリ側で整合性を保つ設計が残っています。
例えば注文削除です。
DELETE FROM users WHERE id = 10;
注文テーブルが存在しても削除できます。
孤立した注文データが残ります。
後から原因不明のバグになります。
インデックスも自動では最適化されない
MySQLは自動でインデックスを張りません。
テーブルを作った直後は高速に見えますが、データが増えると急に遅くなります。
典型例です。
SELECT * FROM orders WHERE user_id = 100;
初期
- 速い
数百万件後
- 数秒かかる
アプリケーションの性能問題に見えますが、インデックス不足です。
ORMを使っても解決しない
最近はORMを使うことが多いですが、これも万能ではありません。
ORMは正しいテーブル設計を前提にしています。
制約のないMySQLに接続すると、ORMは不整合データを扱うことになります。
結果として、次のような現象が起きます。
- 取得結果がランダム
- 更新が反映されない
- ページングが壊れる
なぜ「簡単」が危険になるのか
MySQLは、書いた通りに動きます。
これは利点ですが、同時に責任も発生します。
何も定義しなければ、何も検証されません。
つまり設計の甘さがそのままデータになります。
厳密なDBでは、設計ミスは早期にエラーとして出ます。
MySQLでは運用後に現れます。
そのため「最初は順調、後で崩壊」という形になりやすいのです。
対策:最低限やるべきこと
MySQLを安全に使うために最低限必要です。
- 主キーを必ず定義
- NOT NULLを明示
- 外部キー制約を使う
- インデックスを設計する
- STRICTモードを有効化
これらは高度なチューニングではありません。
RDBMSとしての前提条件です。
まとめ
MySQLが簡単と言われるのは事実です。
ただしそれは「始めやすい」という意味です。
設計を省略できるという意味ではありません。
むしろ省略した分だけ、問題は後から現れます。
MySQLは危険なデータベースではありません。
ただし、開発者の設計をそのまま受け入れるデータベースです。
つまりMySQLの難しさは操作ではなく設計にあります。
簡単に見えるほど、設計の責任がこちら側にあることを忘れたとき、最初のトラブルが発生します。