MyISAMからInnoDBに変更する際に知っておく必要がある落とし穴/事項はありますか
-
03-07-2019 - |
質問
私のプロジェクトの1つはMySQLのMyISAMエンジンを使用していますが、あちこちでトランザクションサポートが必要なため、InnoDBに変更することを検討しています。
- これを行う前に、私は何を見るべきか、考慮すべきですか?
- エンジンを変更するだけでいいですか、それともデータを準備する必要がありますか?
解決
はい、確かに多くのことがあります。アプリケーションを非常に徹底的にテストする必要があります。
- トランザクションはデッドロックする可能性があり、繰り返す必要があります。これは(状況によっては)1行のみを挿入する自動コミットトランザクションでも同様です。
- ディスク使用量はほぼ確実に増加します
- 書き込み中のI / O負荷はほぼ確実に増加します
- InnoDBがクラスター化インデックスを使用するため、インデックス作成の動作が変更されます-これは場合によっては有益な効果があります
- バックアップ戦略が影響を受けます。これを慎重に検討してください。
移行プロセス自体は、大量のデータがある場合は時間がかかるため、慎重に計画する必要があります(その間、データは読み取り専用または完全に使用不可になります-確認してください!)
他のヒント
大きな警告が1つあります。書き込み中に何らかの種類のハードウェア障害(または同様の障害)が発生した場合、InnoDBはテーブルを破損します。
MyISAMも同様ですが、mysqlcheck --auto-repairによって修復されます。 InnoDBテーブルでこれを試みると失敗します。はい、これは経験からです。
これは、InnoDBを使用するための適切な定期的なデータバックアップ計画が必要であることを意味します。
その他の注意事項:
InnoDBは、テーブル/データベースを削除したり、レコードを削除した後、ファイルシステムの空き領域を再割り当てしません。これは、「ダンプとインポート」で解決できます。またはmy.cnfで innodb_file_per_table = 1
を設定します。
大きなInnoDBテーブルでのインデックスの追加/削除は、現在のテーブルをロックし、変更されたインデックスを使用して一時的なテーブルを作成し、データを行ごとに挿入するため、非常に面倒です。 Innobaseのプラグインがありますが、動作しますMySQL 5.1のみ
InnoDBは非常に多くのメモリを必要とします。サーバーメモリが許容する限り大きな innodb_buffer_pool_size
変数を使用することをお勧めします(70〜80%が安全な賭けです)。サーバーがUNIX / Linuxの場合、sysctl変数 vm.swappiness
を0に減らし、 innodb_flush_method = O_DIRECT
を使用して二重バッファリングを回避することを検討してください。これらの値を切り替えるときにスワップをヒットするかどうかを常にテストします。 Perconaブログ、これはすばらしい。
また、-single-transaction --skip-lock-tables
を使用して mysqlbackup
を実行し、バックアップの開始中にテーブルロックを持たないこともできます。
いずれにせよ、InnoDBはすばらしいので、落とし穴に落胆させないでください。
テーブルを変更してエンジンを設定するだけで問題ありません。
- 注意すべき大きなものの1つは、MyTableからの
select count(*)
がInnoDBでMyISAMよりも非常に遅いことです。
- auto_incrementの値は、サーバーの再起動後にテーブル+1の最大値にリセットされます。これにより、削除が乱雑なdbがある場合、おかしな問題が発生する可能性があります。
- 最適なサーバー設定は、主にMyISAM dbとは異なります。
- innodbファイルのサイズがすべてのデータを保持するのに十分な大きさであることを確認してください。さもないと、テーブルのエンジンを変更するときに一定の再配置によって十字架につけられます。
同時クエリを取得する方法としてInnoDBを使用する場合は、 innodb_file_trx_commit = 1
を設定して、パフォーマンスを回復します。 OTOH、トランザクションを認識するようにアプリケーションを再コーディングする場合、この設定を決定することは、InnoDB設定に必要な一般的なパフォーマンスレビューの一部になります。
他の注意すべき重要な点は、InnoDBはフルテキストインデックスもINSERT DELAYEDもサポートしていないことです。しかし、その後、MyISAMは参照整合性をサポートしません。 :-)
ただし、トランザクション対応に必要なテーブルのみを移動できます。これをやった。小さなテーブル(数千行まで)は、しばしばその場で偶然変更できます。
パフォーマンス特性は異なる場合があるため、負荷に注意する必要がある場合があります。
データに問題はありません。