タスクはある種の価格表をアップロードすることなので、これを実装する前に簡単な質問をします。
一度に1000行、たとえば100,000行を挿入する場合は、http://dev.mysql.com/doc/refman/5.5/en/optimizing-myisam-bulk-data-loading.htmlをお勧めします。
「非常に多くの連続した挿入を行う場合、他のスレッドがテーブルにアクセスできるようにするために、時々(1,000行程度)ロックテーブルに続いてアンロックテーブルを実行できます。これでもパフォーマンスが向上します。」
明らかに、私がテーブルに「WRITE LOCK」を持っている間、あなたはまだテーブルを正しく読むことができますか?
私が尋ねる理由は次のとおりです:http://dev.mysql.com/doc/refman/5.0/en/lock-tables.htmlは言う:
ロックを保持しているセッションのみがテーブルにアクセスできます。ロックが解除されるまで、他のセッションはそれにアクセスできません。
「アクセスできます」...まあ、もしそうなら、システム全体がフリーズするでしょう...私たちは単にそれを持っていることができません...これは実際の場合ですか、それとも「...いいえ他のセッションは、ロックが解除されるまでテーブルに書き込むことができます。」?
最終的に私がやりたいのは、システムに影響を与えることなく、100,000行の単純なデータを挿入することです。利用した:
値に挿入(1,0.00)、(2,0.00)、... ...、(999,0.00)
ただし、これにより、何らかの理由で行が追加されないことがよくあります。
LOCK TABLES ... WRITE
他のスレッドがない状態でテーブルをロックすると、そのテーブルの読み取り/書き込みが可能になります。
最善のアプローチは、複数行の挿入ステートメントを使用することです
INSERT INTO table (f1,f2,f3....) VALUES
(v1,v2,v3...),
(v1,v2,v3...),
...
おそらく、行をそれぞれ1〜10K行の複数のステートメントに分割する必要があります(max_packet_sizeやその他の設定によってはさらに大きくなる可能性があります)。
MyISAMは、テーブルの中央のどこかに空のスペースに挿入すると、テーブルをロックします。そのテーブルに対して挿入のみ(削除なし)を行う場合は、複数のスレッドを挿入して選択しても問題ありません。
テーブルに頻繁な削除/更新がある場合は、InnoDBへの切り替えを検討する必要があります。
「何らかの理由で行が追加されていない」については、ステートメント/コードのどこかにエラーがあることはほぼ間違いありません。ステートメントは行を挿入するか、エラーを返します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加