MySQL はオープンソースで利用でき、高速で人気の高いリレーショナルデータベースです。ここでは、MySQL 利用時の注意点を示します。

  • 順序が用意されていないため、順序はテーブルを利用して擬似的に扱います。
  • 日本語カラム名を設定するとエラーが発生することがあります。
  • MySQLは、主キー(複合主キーも合わせて)の長さは 1023 バイト以内でなければならないという制約があります。この制約を越えるようなモデルの定義を行った場合、テーブル作成時に次のようなエラーが発生します。
    「java.sql.SQLException: Specified key was too long; max key length is 1024 bytes」
    上記エラーが発生した場合には、モデルの定義を見直し主キーの長さが 1023 バイト以内に収まるようにしてください。
  • テーブル名(Wagbyのモデル名)の最大長は 64 文字です。
  • カラム名(Wagbyのモデル項目名)の最大長は 64 文字です。
  • MySQL 4/5 ではデータベースの文字エンコーディングに UTF-8 を使用した場合でも、扱える文字は1文字3バイトまでの範囲に制限されます。このため Windows Vista で採用されたサロゲート・ペア文字を登録することができません。[詳細...] これは MySQL 5.5 で utf8mb4 という文字コードを指定することで対応できます。[参考...]
  • 1つのテーブル内に含まれる項目のバイト数は、合計で65,535バイト以内になります。例えばintegerは4バイト、というように数えます。詳細はMySQLのマニュアルをお読み下さい。ここでの注意点はvarchar型です。例えばvarchar(255)という文字型項目を100項目定義した場合、255文字の100項目で25,500バイトと捉えてしまいますが、実際にはUTF-8エンコードを採用しているため、さらにその3倍の76,500バイトとなり、制限を超えてしまいます。(MySQLのUTF-8エンコーディングは、1文字3バイトとして扱います。)よって項目数が多いモデル(テーブル)では、文字列型項目はこまめに大きさを指定するなどの工夫が必要になります。
  • MySQL 6 では文字列型の標準は1文字4バイトになります。そのため上記の "MySQLは、主キー(複合主キーも合わせて)の長さは 1023 バイト以内でなければならない" という制約にかかりやすくなります。データベースの種類に "MySQL 6" を選択すると、文字列型主キーのみ varchar(64) が標準マッピングルールとなります。(ただし、ユーザーが「テーブル定義の型」を明示的に指定した場合は、そちらを優先します。)

Wagby で指定した型は、データベース内で次のように扱われます。

整数型 integer
文字列型 varchar(255) (※1,2)
文字列型 (テキストエリア) text (※3)
日付型 date
時間型 time
日付時間型 datetime
ファイル型(ファイル名) varchar(255)
1バイト整数 tinyint
2バイト整数 smallint
4バイト整数 integer
8バイト整数 bigint
4バイト浮動小数点数 float
8バイト浮動小数点数 double precision
固定値 (作成日/更新日) datetime
その他 (URL型/メールアドレス型など) varchar(255)
  • モデル参照の場合は、参照先モデルの主キーの型に準じます。
  • 開発者の方で型を変更することもできます。詳細は「リポジトリ > モデル項目の定義 > データベースの詳細」をお読み下さい。
1 varchar 型で指定する数は MySQL のバージョンによって変わります。4.1 以前は「バイト」単位ですが、それ以降は「文字」単位です。詳細は MySQL のマニュアルでご確認ください。
2 データベースの種類に "MySQL 6" を選択すると、文字列型主キーのみ varchar(64) を標準マッピングとしました。(ただし、開発者が「テーブル定義の型」を明示的に指定した場合は、そちらを優先します。)
3 MySQL の text 型は 65,535 バイトまでの文字を格納できます。それ以上の文字列を格納する場合は、"mediumtext" や "longtext" 型などを利用してください。

インポート処理の改善

Wagby のインポート処理では、大量の更新用SQLを発行します。このとき、MySQL がトランザクション毎に物理ディスクに対してログのフラッシュ処理が行われる設定になっていると、処理に時間がかかります。

次のように設定すると、書き込みパフォーマンスが向上します。

innodb_flush_log_at_trx_commit = 0

ただしこの設定のままですと、通常の運用で障害発生時にデータを失う可能性が高まるので、インポート処理が終わり次第、デフォルト値 ("1") に戻すことが求められます。

Wagbyが提供するデータのインポートツールInitLoaderは、開発者が独自に定義したSQL文を実行することができます。

InitLoaderが読み込む設定ファイルに記述したsql要素で、複数のSQLをセミコロンで区切って記述する場合、MySQLのMultiQueries指定を有効にする必要があります。

環境設定ファイル project_env.xls で、MySQL への接続URLの末尾に以下の指定を加えることで、本設定を行うことができます。

&allowMultiQueries=true

参考情報:「Connector/J の Driver/Datasource クラス名、URL シンタックス、および構成プロパティ」
http://dev.mysql.com/doc/refman/5.1/ja/connector-j-reference-configuration-properties.html