mysqlストレージエンジン:InnoDBとMyISAM


1. MyISAM:
これはデフォルトのタイプで、従来のISAMタイプに基づいており、ISAMはIndexed Sequential Access Method(インデックス付きシーケンスアクセス方法)の略であり、記録とファイルを格納する標準的な方法である.他のストレージエンジンと比較すると、MyISAMはテーブルの検査と修復の多くのツールを持っている.MyISAMテーブルは圧縮可能であり、全文検索をサポートする.トランザクションは安全ではなく、外部キーもサポートされていません.物事がロールバックすると不完全なロールバックをもたらし、原子性を持たない.大量のSELECTを実行すれば、MyISAMがより良い選択です.
2. InnoDB:
このタイプはトランザクションが安全です.BDBタイプと同様の特性を有し、外部キーもサポートする.InnoDBテーブルの速度が速い.BDBよりも豊富な特性を有するため、トランザクションセキュリティのストレージエンジンが必要な場合は使用することを推奨する.もしあなたのデータが大量のINSERTやUPDATEを実行している場合は、性能面からInnoDBテーブルを使用するべきです.
物事をサポートするInnoDBタイプのラベルでは、AUTOMMITのデフォルト設定がオンであり、BEGINを明示的に呼び出してトランザクションを開始しないため、挿入ごとに自動的にCommitが発生し、速度に深刻な影響を及ぼします.sqlを実行する前にbeginを呼び出すことができ、複数のsqlが1つのものを形成する(autocommitが開いてもよい)ことで、パフォーマンスが大幅に向上します.
InnoDBとMyISAMはMySQLで最もよく使われる2つのテーブルタイプで、それぞれメリットとデメリットがあり、具体的な応用によって異なります.以下は既知の両者の違いであり、参考に供する.
innodb
InnoDBはMySQLにトランザクション(commit)、ロールバック(rollback)、クラッシュ修復能力(crash recovery capabilities)を持つトランザクションセキュリティ(transaction-safe(ACID compliant))型テーブルを提供します.InnoDBにはロー・ロック(locking on row level)があり、Oracleタイプと一致するノン・ロック・リード(non-locking read in SELECTs)があります.これらの特性は、マルチユーザの同時操作のパフォーマンスを向上させます.InnoDBテーブルでは、InnoDBのカラムロック(row level locks)は非常に小さな空間に適しているため、ロックを拡大する必要はありません.InnoDBは、MySQLで最初に外部キー制約を提供するテーブルエンジンです.
InnoDBの設計目標は、大容量データベースシステムを処理することであり、そのCPU利用率は他のディスクベースのリレーショナルデータベースエンジンとは比べものにならない.技術的には、InnoDBはMySQLのバックグラウンドに配置された完全なデータベースシステムであり、InnoDBはメインメモリに専用のバッファプールを構築してデータとインデックスをキャッシュします.InnoDBはデータとインデックスを表領域に格納し、複数のファイルを含む可能性があります.これは他のものとは異なり、例えばMyISAMでは、表は個別のファイルに格納されます.InnoDBテーブルのサイズはオペレーティングシステムのファイルサイズに限られ、一般的には2 GBである.
InnoDBのすべてのテーブルは同じデータファイルibdata 1に保存されており(複数のファイル、または独立した表領域ファイルである可能性もあります)、比較的バックアップが難しく、無料のスキームはデータファイルのコピー、binlogのバックアップ、mysqldumpを使用することができます.
MyISAM
MyISAMはMySQLのデフォルトのストレージエンジンです.
各MyISAMテーブルは3つのファイルに格納されます.frmファイルはテーブル定義を格納します.データファイルはMYD(MYData)です.インデックスファイルは、MYI(MYIndex)エクステンションです.
MyISAMは比較的簡単なので効率的にInnoDBより優れています.小型アプリケーションはMyISAMを使うのがいい選択です.
MyISAMテーブルはファイル形式で保存されており、プラットフォーム間のデータ転送でMyISAMストレージを使用すると手間が省けます
以下に、いくつかの詳細と具体的な実装の違いを示します.
1.InnoDBではFULLTEXTタイプのインデックスはサポートされていません.
2.InnoDBにテーブルの具体的な行数を保存しない、すなわちselect count(*)from tableを実行する場合、InnoDBはテーブル全体をスキャンして何行あるかを計算するが、MyISAMは保存した行数を簡単に読み出すだけでよい.count(*)文にwhere条件が含まれている場合、2つのテーブルの操作は同じです.
3.AUTO_についてINCREMENTタイプのフィールドで、InnoDBにはこのフィールドのみのインデックスが含まれている必要がありますが、MyISAMテーブルでは、他のフィールドと組み合わせてインデックスを作成できます.
4.DELETE FROM tableの場合、InnoDBはテーブルを再構築せず、1行1行削除します.
5.LOAD TABLE FROM MASTER操作はInnoDBには役に立たず、解決策はまずInnoDBテーブルをMyISAMテーブルに変更し、データをインポートしてからInnoDBテーブルに変更するが、使用する追加のInnoDB特性(例えば外部キー)のテーブルには適用されない.
また、InnoDBテーブルのロー・ロックも絶対ではありません.SQL文を実行するときにMySQLがスキャンする範囲を特定できない場合、InnoDBテーブルはupdate table set num=1 where name like"%aa%"などのテーブル全体をロックします.
いずれのテーブルも万能ではなく、適切なビジネス・タイプに対して適切なテーブル・タイプを選択するだけで、MySQLのパフォーマンスのメリットを最大限に発揮できます.
以下はInnoDBとMyISAMのいくつかの連絡と違いです!
1.4.0以上のmysqldは、max以外のバージョンを含むトランザクションをサポートします.3.23のトランザクションをサポートするにはmaxバージョンmysqldが必要です.
2.テーブルの作成時にtypeを指定しない場合、デフォルトはmyisamであり、トランザクションはサポートされません.
show create table tablenameコマンドでテーブルのタイプを見ることができます.
2.1トランザクションをサポートしていないテーブルに対してstart/commit操作をしても何の効果もありません.commitを実行する前にコミットされ、テストされました.
msyqlを実行します.

use test;
drop table if exists tn;
create table tn (a varchar(10)) type=myisam;
drop table if exists ty;
create table ty (a varchar(10)) type=innodb;

begin;
insert into tn values('a');
insert into ty values('a');
select * from tn;
select * from ty;

記録が見えます
別のmysqlを実行します.

use test;
select * from tn;
select * from ty;

tnだけが記録を見ることができます
そして反対側に
commit;
記録が見えます.
3.次のコマンドを実行して、myisamテーブルよりもinnodbテーブルの方が安全な非トランザクションテーブルをトランザクションに切り替えることができます.

alter table tablename type=innodb;

3.1 innodbテーブルはrepair tableコマンドとmyisamchk-r table_を使用できません.name
ただし、check table、およびmysqlcheck[OPTIONS]database[tables]を使用できます.
4.mysqlデータベースを起動するコマンドラインに次のパラメータを追加すると、新しく公開されたmysqlデータテーブルがデフォルトでトランザクションを使用するようになります(
create文にのみ影響します.)
--default-table-type=InnoDB
テストコマンド:

use test;
drop table if exists tn;
create table tn (a varchar(10));
show create table tn;

5.デフォルトのテーブル・タイプを一時的に変更して使用できます.

set table_type=InnoDB;
show variables like 'table_type';

または、
./mysql/bin/mysqld-max-nt --standalone --default-table-type=InnoDB