MyISAMからInnoDBに乗り換えるまとめ

MyISAMからInnoDBに乗り換える事について調べた事のまとめです。

対象のテーブル単位で変換可能です。

簡単に変更出来ます(コマンド↓の方に記載あり)が、安易に変換せず、色々調査したり、注意しておく事がありました。

スポンサーリンク

何故、MyISAMからInnoDBに乗り換えたいか

MyISAMだとテーブルロックになってしまい、全部ロック状態になる事があったので、InnoDBに切り替えたいと思いました。その時の調査記録はこちらです。

https://normalblog.net/system/mysql/myisam-state-locked/

MyISAMからInnoDBに乗り換える前に注意する点

AUTO INCREMENT・DELETEを使用している場合

挙動が違うケースがあり、アプリ側の修正が発生する可能性があるので、乗り換える前に修正ボリューム調査が必要です。

参考サイト様

MySQLでMyISAMからInnoDBに乗り換える際に知らないとハマる、怖い話

http://y-ken.hatenablog.com/entry/mysql-migration-from-mysiam-to-innodb-tips

ストレージエンジンをMyISAMからInnoDBへ切り替える際の注意

http://gihyo.jp/dev/clip/01/groonga/0006?page=3

以下に該当するクエリを利用している場合

  • INSERT IGNORE INTO …
  • INSERT INTO … ON DUPLICATE KEY UPDATE …
  • LOAD DATA … IGNORE INTO …
  • DELETE FROM … WHERE id = …

InnoDBにすればテーブルロックの呪縛から逃れられるかというと必ずそうでもない

今回の自分のように、MyISAMのテーブルロックをやめたいのでInnoDBに切り替えようとしている場合は、InnoDBでも必ずしも行ロックになるわけではないという点に気を付けておきたいです。

参考サイト様 http://blog.livedoor.jp/sasata299/archives/51345903.html

InnoDB であってもユニーク制約 or インデックスが張られているカラムで検索した場合以外はテーブルロックになってしまうようです。これは注意しないと思わぬところでテーブルロックになってしまって大変なことになりそう!

・ユニーク制約 or インデックスが貼られているカラムで検索した場合、行ロック
・それ以外のカラムで検索した場合、テーブルロック

参考サイト様 http://bluerabbit.hatenablog.com/entry/2013/12/07/075759

InnoDBで行ロック/テーブルロックになる条件を調べて見ました。この動きを見るとInnoDBでテーブルロックだ!と思っていたのはストレージエンジンが複数行読み込み全部の行を行ロックしていた(している)と言った方が正しそうですね。

容量がInnoDBの方が大きくなってしまう

確かに、InnoDBだとログファイルがどんどん大きくなって環境を圧迫した経験があります。↓

https://normalblog.net/system/vagrant/binarylog/

これは確かに良くおこりそうな事に感じます。

参考サイト様

MyISAMからInnoDBへ切り替えるときの注意点 http://nippondanji.blogspot.jp/2009/02/myisaminnodb.html

InnoDBの方がデータサイズが大きい

InnoDBのデータ領域は16KBごとにページ化されており、さらにMVCCのためのメタデータ(タイムスタンプや削除フラグなど)を行ごとに持っているため、消費するデータサイズは大きくなってしまう。消費するディスクスペースはMyISAMの2〜3倍を見込んでおくといいだろう。

他にも色々・・・

別に重要でないから「他」としてまとめたわけではないのですが、まだ自分の経験範囲・試すのに時間がかかりそう、などでコメントが書けなさそうでしたので別にしました。

参考サイト様

MyISAMからInnoDBへ切り替えるときの注意点 http://nippondanji.blogspot.jp/2009/02/myisaminnodb.html

  • トランザクション対応
  • 更新処理でMyISAMとInnoDBを混在させない
  • 全文検索機能がない
  • InnoDBでは全く異なるチューニングが必要
  • PRIMARY KEYの扱い
  • バックアップ
  • データ移行作業

MyISAMからInnoDBに変更するコマンド

このコマンドで変換出来ます。

逆にMyISAMにする場合は以下です。

https://normalblog.net/system/mysql/mysql_matome/#MyISAMInnoDB