SitePoint: New Articles, Fresh Thinking for Web Developers and Designers

PHPを使ってWebサイトやWebアプリケーションを構築する場合はデータベースも併用することが多い。そしてその場合に採用されることが多いデータベースのひとつにMySQLがある。PHPはすぐに利用できるようになるプログラミング言語といわれているが、MySQLやSQLはそうではない。堅牢で信頼できるデータベースを設計し、それを扱うSQLクエリを作成するにはそれなりの学習時間と経験が必要だ。

こうした話題がSitePointにおいてTop 10 MySQL Mistakes Made By PHP Developersとして掲載されている。PHPデベロッパが犯しがちな10のMySQLミステイクという内容になっている。どういった間違いをしてしまうか簡単にまとまっており参考になる。紹介されている内容は次のとおり。

  1. InnoDBではなくMyISAMを使ってしまう。MyISAMはデフォルトで使われるが、シンプルなデータベースや実験的な目的で以外では使わないほうがよい。MyISAMは外部キー制限やトランザクションといった機能をサポートしないため、データの完全性確保という点で問題がある。レコードの挿入や更新時にテーブルをロックするため性能にも懸念があり、InnoDBを使った方がいい。
  2. PHPの提供しているMySQL関数を使ってしまう。MySQL Improved Extension (mysqli)を使うようにする。mysqliの方がSQLインジェクション攻撃への対処やパフォーマンス確保が実現しやすく、マルチステートメントやトランザクションもサポートしている。
  3. ユーザの入力するデータをチェックしないでそのまま使ってしまう。ユーザの入力は信用しないこと。また、ブラウザ側で動作するJavaScriptを使ったチェックに頼るのではなく、サーバサイドのPHPでちゃんと検証すること。
  4. UTF-8を使わないでプログラムを組んでしまう。米国、英国、オーストラリアなどではやりがち。UTF-8を使うようにする。
  5. SQLを使うよりもPHPで処理をしてしまう。たしかにSQLに不慣れな状態ではPHPで機能を実装してしまうのはわかるが、機能が提供されている場合にはSQLの機能を使ったほうが高速に処理できる。
  6. SQLクエリを最適化しないで使ってしまう。多くのWebアプリやWebサイトがたったひとつの悪いSQLクエリによってパフォーマンス上の問題を抱えている。SQLクエリを最適化して利用する。
  7. 間違ったデータ型を使っている。適切なデータ型を使えば高速に、そして簡単に処理できるところを、誤ったデータ型を使うことで複雑化し、そして遅いシステムなってしまっている。
  8. SELECTクエリで*を使ってしまう。必要なデータのみを取得するように変更する。
  9. インデックスを使いすぎている。インデックスを使ったほうが検索は高速になるが、すべてのカラムに適用するようなことをすれば挿入や更新処理でパフォーマンス劣化を引き起こす。必要なところに対してのみインデックスを使うようにする。
  10. バックアップを忘れる。データベースは稀にだが壊れることがある。バックアップは必須。

Top 10 MySQL Mistakes Made By PHP Developersではほかのデータベース候補としてPostgreSQLやFirebirdなどにも言及している。商用データベースの無償版としてはMS SQL Server ExpressやOracle Database 10g Expressなども紹介。また、組み込み向けなどとしてMySQLにも言及している。

Top 10 MySQL Mistakes Made By PHP DevelopersではInnoDBの使用を推奨しているが、もちろんMyISAMの方が適切に利用できるシーンもある。ただし、InnoDBの機能強化が進んだ結果、多くのシーンでInnoDBの方が適切なストレージエンジンとして活用できるようになっていると言われている。