2012-03-16 26 views
5

私は1700万行のテーブルを持っています。私はそのテーブルの1列をつかみ、それをすべて別のテーブルに挿入する必要があります。ここに私がやったことだ:mysql innodbとmyisamの挿入

INSERT IGNORE INTO table1(name) SELECT name FROM main WHERE ID < 500001 

InnoDBは約3分45秒

で実行しかし、MyISAMテーブルはちょうど下の4秒で実行されます。なぜ違い?

誰もがInnoDBを賞賛しているのを見ていますが、正直なところ私はそれが私にとってどのように優れているかわかりません。それはずっと遅いです。私はそれが完全性とそれ以外のものについては素晴らしいことを理解しますが、私のテーブルの多くは更新されません。私はInnoDBを気にする必要がありますか?

+0

を私はリレーショナルテーブルで作業していたとき、私は唯一のInnoDBを使用しています。それ以外の場合は、外部キーがない場合はMyISAMが好きです。 –

+0

ちょうど指摘すると、両方のテーブルにインデックスがあります。 "main"テーブルは現在myisamです。 – nick

+0

ベン、私はリレーショナルテーブルを使用したいと思いますが、おそらく何百万もの行を扱うことになります。何十もの列をインデックスする必要があります。完全性はあまり問題ではありません。少なくともこの部分ではない。 – nick

答えて

12

違いは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(バルクデータロードのヒントを参照してください)

+0

私が間違っていたり、何かを残してしまった場合は、MySQLのパフォーマンス専門家(特にPercona)は私を訂正してください。私は答えを更新します。 – FlipMcF

+0

"innodb-buffer-pool-sizeの制限値に達する"と不正確です。実際には、フラッシュは "innodb_max_dirty_pages_pct"を押すことに関連しています。しかし、それはこの質問のために髪を分割していると思います。 – FlipMcF

+0

またお読みください:http://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/ – FlipMcF

1

あなたは、いくつかの拡張権利件まで言っています。 InnoDBの方がMyISAMよりも遅いですが、どの場合ですか? すべての人の要求を満たすことはできません。 INNODBはトランザクションデータベースエンジンであり、MyISAMはそうではありません。したがって、ACID準拠およびトランザクション対応ストレージエンジンにするためには、応答時間の点でコストを支払わなければなりません。

さらに、my.iniなどの設定ファイルを使用して、InnoDBが適切に調整されていると、InnoDBはより高速に動作します。

終わりに、私は人々がInnoDBの賞賛されている理由を次のような理由を理解することができています:MyISAMテーブルながら、テーブルの上に作業中

  1. をそれはACIDサポートに準拠し、トランザクションエンジンです
  2. これは、行レベルのロックを取りますテーブルレベルロックに
  3. を取るInnoDBは非常に

最後にではなく、私から少なくともコメントの同時実行性を向上させるために、マルチコア/マルチプロセスのマシン用に調整可能です側部;何かが "みんなのニーズ"を満たすことができるので、どちらのシナリオでも両方のエンジンを比較しているだけです。

関連する問題