1

複数のワーカー アプリケーションによってアクセスされるテーブルがあります。このアプリケーションは、レコードのバッチを取得し、レコードの一部を計算し、計算結果を更新してこのテーブルに戻します。このテーブルは現在 MyISAM ベースですが、計算アルゴリズムにいくつかの変更を加えた結果、大幅な高速化が実現したため、MyISAM テーブルであるため、テーブルに多くのロックが発生することが予想されます。(テーブルには約650 ~ 700 000 のレコードがあります)。

すべてのレコードが処理されると、それに基づいてレポートが生成され、テーブルが切り捨てられます。テーブルが切り捨てられると、プロセスによってテーブルが再初期化され、サイクルが再び開始されます。

ロックを防ぐためにMyISAMテーブルをInnoDBに切り替えることを考えていましたが、INSERT INTO .. SELECT .. FROMステートメントでテーブルを初期化するプロセス(以前は3〜4分かかりました)は、停止することにしたときに35〜40分間実行されていました. どうしてこれなの?それをスピードアップする方法はありますか?

4

1 に答える 1

1

MyISAM は、挿入された順序でレコードを保存します。一方、InnoDB の主キーはクラスター化されたインデックスであるため、レコードは主キーと同じ順序で物理的に格納されます。したがって、主キーの順序で挿入していることを確認してください。INSERT INTO ... SELECT に ORDER BY 句を追加できます。

また、ページの分割とセカンダリ インデックスの再構築を避けるために、最初の行を挿入した後にセカンダリ インデックスを追加します。そのため、インデックスを削除してから、再度追加してください。

また、行ロック (および自動インクリメント ロック) のオーバーヘッドを回避するには、LOCK TABLES を使用してテーブルを明示的にロックします。

最後に、innodb_buffer_pool_sizeを増やします。そうしないと、インデックスの構築が非常に遅くなります。デフォルトはわずか 8MB です。

于 2012-07-12T12:39:02.103 に答える