一意のキーを使用してMyISAMのパーティションでMySQL挿入を高速化する


9

大きなMyISAMテーブル(約3000万行)があります。ある時点で固定行形式に切り替えたので、テーブルはディスクで最大40Gb、インデックスで2Gbを使用します。テーブルには一意のインデックスがあり、1秒あたり100件の「重複キーの更新時に挿入」クエリがあります。テーブルが大きくなるにつれて、これらの挿入はますます遅くなります。

よくわかりませんが、パーティションを使用すると、挿入を高速化できますか?

回答:


1

まず、同時書き込みは、MyISAMストレージのオプションではありません。それぞれがテーブル全体をロックします(場合によっては読み取りを除く)。InnoDBがうまく機能しない場合は、TokuDBを試してください。しかし、TokuDB(もちろんInnoDB)エンジンのトランザクションの性質上、MyISAMに比べて遅くなります(同じデータを少なくとも2回書き込む必要があります:ジャーナルとデータファイル)。また、サーバーがいつかクラッシュした場合、40Gb MyISAMテーブルが修復されるまで数時間待機します。

それでもMyISAMテーブルにデータをロードしたいが、高速に実行したい場合LOAD DATA INFILEは、挿入の代わりに使用することをお勧めします。これは、大量のデータをテーブルにロードする最も速い方法です。そしてはい、インデックスは指数関数的な方法で挿入のパフォーマンスを低下させます。

パーティションについて:MySQLのINSERTステートメントはプルーニングをサポートしていないため、各ステートメントですべてのパーティションがスキャンされ、一意のインデックスの一致が確認されます。また、すべてのパーティションは挿入が終了するまでロックされます。


もう一つの興味深いエンジン:code.facebook.com/posts/190251048047090/...
GreyWolf

0

これらの挿入クエリは同時ですか、それとも同じプロセスから発生したものですか?それらが並行している場合、MyISAMがテーブル全体をロックし、InnoDBが行ロックを利用するため、このテーブルにはInnoDBストレージを使用する方が適切です。別のストレージに切り替えることができない場合は、INSERT DELAYEDステートメントと他のいくつかの挿入最適化を試すことができます。別のパーティションを別の物理ディスクに配置しない限り、パーティション分割は役に立ちません。


これらの挿入は同時に行われます。ただし、InnoDBは「重複キーの更新時に挿入」するのが遅すぎるため、オプションではありません。私が知る限り、IOはボトルネックではありません。RAMの量>>インデックスと書き込みキャッシュを含むテーブルのサイズがオンになっています。問題は内部のmysqlのロックのどこかにあると思います。
d0rc 2011

INSERT DELAYEDは、値リストを指定するINSERTステートメントにのみ使用してください。サーバーは、INSERT ... SELECTまたはINSERT ... ON DUPLICATE KEY UPDATEステートメントのDELAYEDを無視します。
llazzaro 2011

「InnoDBは遅すぎる」-少し調整してみましたか?デフォルト設定はかなり貧弱です。
rvs '24
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.