ログを保存するフィールドがあるMEDIUMTEXT
のテーブルがあります。
次のように私は、ログにデータを追加している:短いログの場合読んでいないMySQL CONCAT
UPDATE tbl SET log = CONCAT(log, 'newtext')
を、それが正常に動作しますが、ログのフィールドが大きくなるにつれて時間をかけて、それが指数関数的に遅くなります。 MySQLはフィールド全体を読み込んでから、全体を書き戻しているようです。
パフォーマンスに問題が発生することなくログにデータを追加するにはどうすればよいですか?これを実現する方法がない場合、そのような大きなテキストデータをどのように保存して更新できますか?
単純に1,2,3よりも悪いです。古い行を削除し、新しい大きな行にスペースを割り当てる必要があります。 –
私はあなたのコメントを理解している@RickJamesを確認していません。パフォーマンスの問題は、各INSERTで発生する連結から発生します。各SELECTにはINSERTSが非常に多いという前提で、提案された方法でパフォーマンスが確実に向上します(これは過去に行っており、改善は非常に有意でした)。私があなたを完全に誤解した場合は、明確にしてください。 – FDavidov
異なったフレーズ - ステップ#3は、表面に現れるよりもコストがかかります。記憶域(InnoDBのブロック、MyISAMのストリーム)のために、新しい大きな行を格納すると、ブロック分割や他の「コストのかかる」アクションが発生することがあります。 (私達は合意に達しており、私はあなたの答えが好きです。) –