「MySQLは簡単」という言葉が危険な理由

「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の難しさは操作ではなく設計にあります。
簡単に見えるほど、設計の責任がこちら側にあることを忘れたとき、最初のトラブルが発生します。