違いはinnoDBの設定に起因する可能性があります。これは、myISAMよりも少し微調整が必要です。 innoDBの考え方は、あなたのデータの大部分をメモリに保存し、余分なCPUサイクルがあるときにだけディスクにフラッシュ/読み込みを行うことです。
InnoDBで気にするべきことは本当に良い質問です。 MySQLを使い続けるつもりなら、InnoDBの経験を積むことを強くお勧めします。しかし、大量のトラフィックがなく、規模について心配することのないデータベースに対して、すばやく汚れた仕事をしているなら、MyISAMの使いやすさはあなたのために勝つかもしれません。 InnoDBは、単純なデータベースを必要とする多くの場面において、過度の犠牲になる可能性があります。あなたは99%の読み取りを行っている場合は、まだInnoDBのパフォーマンスからリフトを取得することができます
が、私のテーブルの多くは、
を更新されません。データベース全体をメモリに保持するようにバッファプールのサイズを設定すると、mysqlクエリキャッシュが失われても、InnoDBはデータを取得するためにディスクに移動する必要がありません。 MyISAMでは、ディスクから行を読み込む必要があり、キャッシュと最適化を行うためにオペレーティングシステムを離れる必要があります。
InnoDBのバッファプールサイズ
私の最初の推測では8Mに設定され、箱から出してinnodb_buffer_pool_sizeどの船をチェックすることです。これは、合計メモリの約80%にすることをお勧めします。あなたはその制限をヒットしたら、それは
自動コミット= 0
また、必ず自動コミットが作る高価になることができ、新たなデータのための余地を作るために、バッファから何かをフラッシュする必要があるため、InnoDBのパフォーマンスが大幅に低下しますテーブルをロードしている間は消灯するか、すべてのインサートでフラッシングが発生します。完了後に再び有効にすることができます。クライアント側の設定です。とても安全。
は、あなたが本当にチューン「17million行を挿入する」対応するためにデータベースをしたい場合を考えてみたら
ロードテーブルは、一般的に起こります。どのくらいの頻度でこれを行いますか?このインスタンスではMyISAMがより速くなるかもしれませんが、同時に100個の同時接続でこのテーブルを読み込んで同時に変更すると、innoDBがうまく調整され、MyISAMがテーブルロックを犠牲にすることがわかります。 MyISAMテーブルは、カバーの下に、あなたは、単にファイルに各行を追加(およびインデックスを更新)しているので、MyISAMテーブルは、任意のチューニングなしで、この時は非常に良いだろう
この操作を見てどのように
。お使いのOSとディスクキャッシングは、すべてのパフォーマンス上の問題を処理します。
InnoDBは
この操作を見てどのようにInnoDBがテーブルを知っているだろうが、書き込みを必要とするので、挿入バッファに行をスローします。 次の挿入の前には時間がかからないので、innoDBはバッファを処理する時間がなく、バッファプールに書き込んでインデックスを更新している間に余裕がなく、挿入を '強制的に'保持します。 次に、バッファプールがいっぱいになり、innoDBは強制的にインサートを保持し、バッファプールからいくつかのページをディスクにフラッシュします。 そして、あなたは狂気のようにそれにインサートを投げつけ続けます。 InnoDBをチューニングして、これを実行した後、MySQL>プロンプトを非常に速くすると、InnoDBはまだ余裕を持って追いついていますが、新しいトランザクションを実行する意思があります。
を読み取る必要があります:
http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/
http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html(バルクデータロードのヒントを参照してください)
を私はリレーショナルテーブルで作業していたとき、私は唯一のInnoDBを使用しています。それ以外の場合は、外部キーがない場合はMyISAMが好きです。 –
ちょうど指摘すると、両方のテーブルにインデックスがあります。 "main"テーブルは現在myisamです。 – nick
ベン、私はリレーショナルテーブルを使用したいと思いますが、おそらく何百万もの行を扱うことになります。何十もの列をインデックスする必要があります。完全性はあまり問題ではありません。少なくともこの部分ではない。 – nick