MyISAMは、MySQLで最も人気のあるストレージエンジンの1つです。 MyISAMは、InnoDBに次ぐ2番目の選択肢であることがよくあります。このブログ投稿では、このエンジンを使用するのに最適な方法を見つけようとします。
MyISAMとは何ですか?
MyISAMはMySQLのストレージエンジンの1つです。 MyISAMは、IBMが開発したインデックスアルゴリズムであるISAM(Indexed Sequential Access Method)に基づいており、大量のデータセットから高速に情報を取得できます。ただし、テーブルがロックされているため、1つのテーブルからの読み取りと1つのテーブルへの書き込みを同時に行う場合はうまく機能しません。また、トランザクションもサポートしていません。
一部のMySQLエンジニアにとって、このエンジンはInnoDBの次に最も人気のある選択肢です。MyISAMストレージエンジンは、2005年にMySQLによって提供された唯一のストレージエンジンであり、20年以上使用できました。 MyISAMは、バージョン5.5までのMySQLのデフォルトのストレージエンジンでした。
MyISAMが内部からどのように機能するかを示す図は、このブログの範囲内ではありませんが、エンジンのパフォーマンスを最適化するのに役立つ設定を提供できます。
- Myisam_sort_buffer_sizeは、REPAIR、CREATE INDEX、またはALTERTABLEクエリを実行してインデックスを並べ替えるときに割り当てられるバッファを定義します。
- Key_buffer_sizeは、MyISAMテーブル全体のインデックスブロックに使用されるバッファーのサイズを定義します。このパラメータを増やすと、インデックス処理が向上する可能性があります。
- Sort_buffer_sizeは、ソート操作を実行する必要があるスレッドに割り当てられるバッファーのサイズを示します。
- Read_buffer_sizeは、順次スキャン操作を実行するスレッドに割り当てられるバッファーのサイズを示します。
- Write_buffer_sizeは、書き込みバッファーのサイズを示します。
これらの4つのパラメーターは重要ですが、重要ですが、key_buffer_size変数にも注意を払う必要があります。 key_buffer_size変数は、メモリに保持されるインデックスバッファのサイズを決定します。これは、MyISAMの場合を除いて、innodb_buffer_pool_sizeの対応物と考えてください。サーバーが主にMyISAMテーブルで構成されている場合は、サーバーで使用可能なRAMの約25%以上をkey_buffer_size変数に割り当てることができます。 key_buffer_sizeパラメーターの値を決定する別の方法もあります-key_read_requests値(インデックスを読み取る要求の合計値)とkey_reads値(key_readsの値は必要な要求の数)を比較するだけですディスクから読み取る)。これらのパラメーターの値は、サーバーのステータス変数を確認することで取得できます(MySQLサーバーでSHOW GLOBAL STATUSクエリを発行するだけです)。 key_readsが大きな値を返す場合、key_buffer_sizeの値はおそらく小さすぎることを覚えておくことも有益です。
MyISAMおよびMySQL8.0
一部のMySQLエンジニアに尋ねると、MyISAMはもう使用すべきではないと言われます。なんで?一部の人々は、MySQLが進歩したときに、以前はMyISAMでしか見ることができなかった機能の大部分をInnoDBに追加したため、MyISAMを事実上廃止したと言う人もいます。
- フルテキストインデックスは、バージョン5.6以降InnoDBで使用できます。
- ポータブル表領域は、バージョン5.6以降InnoDBで使用できるようになりました。
- 空間インデックスは、バージョン5.7以降InnoDBで使用できるようになりました。
- テーブルの最後の更新は、バージョン5.7以降InnoDBで利用可能になりました。
では、引き続きMyISAMを使用する必要がありますか?おそらくそうではありません。ただし、注意点が1つあります。単純なCOUNT(*)クエリは、おそらくInnoDBよりもMyISAMの方が高速に実行されることに注意してください。MyISAMは数値をテーブルメタデータに格納しますが、InnoDBは格納しません。
MyISAMを使用していて、InnoDBに切り替えたいのですが、どうすればよいですか?
MyISAMを引き続き使用していて、InnoDBに切り替えたい場合は、すべてのテーブルをInnoDBに変換するだけです。言うまでもなく、言うのは簡単ですが、簡単なガイドは次のとおりです。
- MySQLインスタンス内のどのテーブルがMyISAMを使用しているかを確認します:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ‘database_name’ AND ENGINE = ‘MyISAM’;
- すべてのMyISAMテーブルをInnoDBに変換します:
ALTER TABLE `table_name` ENGINE = InnoDB;
複数のALTERTABLEステートメントを次々に実行したくない場合は、ALTERTABLEステートメントをループに入れることを検討してください。以上です-これで完了です!
MyISAMは、最も人気のあるMySQLエンジンの1つです。エンジンは、5.5までのMySQLバージョンのデフォルトでした。エンジンはInnoDBの次に最も人気のある選択肢の1つですが、MySQL 8.0では廃止されたと言えます-MySQLは、MyISAMで実行できるすべてのことを、InnoDBの使用中にも実行できることをすでに確認しています。 MyISAMは、単純なCOUNT(*)クエリを高速化したい場合にのみ役立ちます。 MyISAMは数値をテーブルメタデータに保存するため、このようなクエリは高速になります。他のMySQLエンジンは保存しません。