私のプロジェクトの1つはMySQLのMyISAMエンジンを使用していますが、あちこちでトランザクションサポートが必要なため、InnoDBに変更することを検討しています。
- これを行う前に、何を確認または検討する必要がありますか?
- エンジンを変更するだけでいいですか、それともデータを準備する必要がありますか?
私のプロジェクトの1つはMySQLのMyISAMエンジンを使用していますが、あちこちでトランザクションサポートが必要なため、InnoDBに変更することを検討しています。
はい、もちろんです。多くのことがあります。アプリケーションを非常に徹底的にテストする必要があります。
大量のデータがある場合は時間がかかるため、移行プロセス自体は慎重に計画する必要があります(その間、データは読み取り専用になるか、完全に利用できなくなります。確認してください)。
その他の注意事項:
テーブル/データベースを削除した後、またはレコードを削除した後、InnoDBはファイルシステムの空き領域を再割り当てしません。これは、「ダンプとインポート」またはinnodb_file_per_table=1
my.cnfでの設定によって解決できます。
大きなInnoDBテーブルでのインデックスの追加/削除は、現在のテーブルをロックし、変更されたインデックスを使用して一時的なテーブルを作成し、データを行ごとに挿入するため、非常に面倒な場合があります。Innobaseのプラグインがありますが、 MySQL5.1でのみ機能します。
InnoDBはまた、はるかに多くinnodb_buffer_pool_size
のメモリを消費します。サーバーのメモリが許す限り大きな変数を使用することをお勧めします(70〜80%が安全な方法です)。サーバーがUNIX/Linuxの場合は、sysctl変数vm.swappiness
を0に減らし、innodb_flush_method=O_DIRECT
二重バッファリングを回避するために使用することを検討してください。これらの値を切り替えるときにスワップを押すかどうかを常にテストします。Perconaブログでいつでも詳細を読むことができます。これはすばらしいことです。
また、バックアップの開始中にテーブルロックを使用して実行mysqlbackup
したり、テーブルロックを使用したりすることはできません。--single-transaction --skip-lock-tables
いずれにせよ、InnoDBは素晴らしいので、いくつかの落とし穴に落胆させないでください。
テーブルを変更してエンジンを設定するだけで問題ありません。
select count(*) from MyTable
がはるかに遅いことです。同時クエリを取得する方法としてInnoDBを使用する場合は、innodb_file_trx_commit=1
パフォーマンスをある程度回復できるように設定する必要があります。OTOH、トランザクション対応になるようにアプリケーションを再コーディングしようとしている場合、この設定を決定することは、InnoDB設定に必要な一般的なパフォーマンスレビューの一部になります。
注意すべきもう1つの重要な点は、InnoDBがFullTextインデックスも、INSERTDELAYEDもサポートしていないことです。ただし、MyISAMは参照整合性をサポートしていません。:-)
ただし、トランザクション対応が必要なテーブルのみを移動できます。私はこれをしました。小さなテーブル(最大数千行)は、偶然にもオンザフライで変更されることがよくあります。
パフォーマンス特性は異なる可能性があるため、負荷を監視する必要がある場合があります。
データは問題ありません。