データ型はなるべく小さくコンパクトに
データベースを設計する際には、データ型を適切に選択することが重要だという。
数値型は、Oracleは1つだけだがMySQLには9つもあり、使い分けが必要。例えば、AUTO_INCREMENTするフィールドで常にBIGINTが必要なわけではない。負の数を必要としないならUNSIGNEDが利用できるので、INT UNSIGNEDとしても43億行まで対応できる。また、お金にかかわるデータは、DECIMALを使う。
文字列には、原則としてCHAR(n)でなくVARCHAR(n)を使う。ただし、VARCHARはメモリを削減できない。UTF-8のVARCHAR(255)列に1バイトのデータを格納しても、メモリ上は765バイトを消費するという。
また、ENUM型を適宜使うこと、BLOBよりファイルシステムを利用するする方が効率的なケースもあること、IPv4アドレスは、文字列としてVARCHAR(12)に保持するより、INET_ATON/INET_NTOQで数値換算すればUNSIGNED INTで(4バイト)収納できること、途中で気づいてALTER TABLEすると待たされるので最初からきちんと設計しておいた方がよいこと、などが紹介された。
オプティマイズ
最後に、最適化にはEXPLAINを使って、MySQLのオプティマイザによる実行計画を表示することが重要だと語った。利用可能なインデックスや利用されるインデックスを確認できるほか、注意事項が出力される。
また、データのシーク(特定の位置から読み出す)とスキャン(連続的に読み出す)がどんなときに起きるかに注意する。例えば、インデックスになる列に関数が使用されると、フルスキャンになることがあるという。
また、CURRENT_DATE()のような戻り値が一定ではない関数を使うとクエリキャッシュが使われないので、このような値はアプリケーション型で代入して、SQL文では定数として扱われるようにすること。クエリに必要がない列はSELECTしないこと(例えば、必要ないのにTEXT型をSELECTすると大きすぎてクエリキャッシュやデータ転送量の面でマイナス)などが紹介された。
こういった技術的な情報は、MySQL ForgeのWikiを参照するとよいとのことだ。
MySQL 5.1が正式リリース
梶山氏の発表では、11月30日に正式(Generally Available)リリースされたMySQL 5.1についても語られた。5.1ではストレージエンジンを選択可能なだけでなく、サーバ稼働中にエンジンをプラグインとして追加/削除が可能だという。
その他にも次のような特徴がある。
- パーティショニング機能
- ログのオンオフをサーバ稼働中に可能
- ログをテーブルに出力可能
- InnoDBはプラグインとして提供される
また、「地味だが便利なツール」として、簡易ベンチマークツール「mysqlslap」が紹介された。次のような機能があるという。
- テスト用のクエリやデータの自動生成
- 複数のストレージエンジンの比較にも便利
