PostgreSQLからMySQLへ移行するポイント
PostgreSQL 7.4.x系からMySQL 5.0.x系(storage engine = innodb)へ移行する案件があって、かつ、社内勉強会の講師をしていたときに移行ポイントの質問がでたので、ポイントをまとめてみました。
Point
- INSERT, UPDATEを内包するサブクエリで失敗する
- トランザクションでいくつかにわけてかく
- 5.0.xだからなのか、クエリに問題があったからなのかイマイチつかめてません。。
- TRIGGERを用いたときに他のエンティティに作用するようなTRIGGERを仕込めない
- アプリで対応。TRIGGERについては、保守系バッチで取り扱ったほうがいいか
- pgsqlではシーケンスを作ることでbig serialを複数振ることができるが、mysqlでは1エンティティについて、auto incrementは1カラムのみ指定。
- 設計段階でシリアルがいっぱいあるエンティティは好ましくないケースが多い。必要な場合はアプリ対応か。
- 細かい話だがpgsql sequenceはデフォで0から連番ふりますが、mysql auto incrementは1から振られる。
- pgsqlでは同一の値をもつROWに対してUPDATEをかけると1 AFFECTEDと返されるがmysqlでは 0 AFFECTEDといわれる。
- 反映があったのかどうか、返り値を参照するような実装をしているときは修正が必要。
- 日付関連で
- mysqlでは、TABLE LOCKするときはREAD/WRITEまで指定が必要。
まだまだいろいろあったような気がするんですが、まぁとりあえずこんなかんじでしょうか。
他にもインデックスの使われ方とか違うと思うし、innodbにしたときに負荷のかかり方が違うかもしれないので、移行するときのチューニング見直しも当然に発生してきます。
mysql5.0.x全般に関して
- サブクエリがいっぱいあるときの処理は結構マズい気がするのでなるべく使わないほうがよいかと・・
- トリガーはまだまだっぽい
pgsql7-8全般に関して