mabots' blog

知のレバレッジを最大化せよ (旧はてなダイアリーから移転しました。)

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といわれる。
    • 反映があったのかどうか、返り値を参照するような実装をしているときは修正が必要。
  • 日付関連で
    • timestamp型はmysql, pgsqlともに存在するが、mysqlはデータが更新されると更新してくれるが、pgsqlはmysqlでいうdatetimeのような挙動をする。
    • また当然にフィルタ条件でINTERVALとかやっているところもそもそもの実装が違うので修正の必要がある。
      • 日付の実装はDBによって結構違うので、重点的にテストが必要なところである。
  • mysqlでは、TABLE LOCKするときはREAD/WRITEまで指定が必要。

まだまだいろいろあったような気がするんですが、まぁとりあえずこんなかんじでしょうか。
他にもインデックスの使われ方とか違うと思うし、innodbにしたときに負荷のかかり方が違うかもしれないので、移行するときのチューニング見直しも当然に発生してきます。


mysql5.0.x全般に関して

  • サブクエリがいっぱいあるときの処理は結構マズい気がするのでなるべく使わないほうがよいかと・・
  • トリガーはまだまだっぽい

pgsql7-8全般に関して

  • イマイチレプリケーション大変そうなので、大規模運営は結構大変そう。mysqlばりにできるようになってくるとすばらしいですね。
  • 機能的には文句なし。