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に変更するコマンド
このコマンドで変換出来ます。
1 |
mysql> ALTER TABLE test_table ENGINE=InnoDB; |
逆にMyISAMにする場合は以下です。
1 |
mysql> ALTER TABLE test_table ENGINE=MyISAM; |
https://normalblog.net/system/mysql/mysql_matome/#MyISAMInnoDB