2

私は多数のベンダーがデータを送信している (または通知を読んでいる) e コマース サイトで作業しており、それぞれの最後の接続の時間を保持する必要があります。ベンダー テーブルの更新が不適切な方法 (パフォーマンスの悪い非常に多数の更新) として示されたので、各ベンダーの最終接続時間を格納するメモリ テーブルを作成しました。その時間は、1 分間に 1 回または 2 回更新されます。更新には、次のクエリを使用します。

UPDATE vendors NATURAL JOIN tmp_vendors SET vendors.last_conn_time = tmp_vendors.last_conn_time

私が mysqld.log で取得し続けるのは次のとおりです。

[警告] BINLOG_FORMAT = STATEMENT であるため、ステートメント形式を使用してバイナリ ログに安全でないステートメントが書き込まれました。別のテーブルから選択した後に自動インクリメント列を含むテーブルに書き込むステートメントは安全ではありません。これは、行が取得される順序によって、どの行が書き込まれるか (存在する場合) が決まるためです。この順序は予測できず、マスターとスレーブで異なる場合があります。

この警告をオフにする方法はありますか (現在の DB 接続でのみ)、またはこれに対するより良い方法はありますか?

4

2 に答える 2

0

スレーブ サーバーの電源が失われると、メモリ テーブルが空白になり、レプリケーションの問題が発生します。そのため、メモリ テーブルからテーブルを更新している限り、おそらくこの警告が表示されます。

残念ながら、現在 MySQL で警告メッセージのログを抑制する方法はありません。

詳細をお知らせいただければ、現在の方法に代わる解決策をご提案できるかもしれません。

于 2012-07-19T15:22:38.287 に答える
-2

memtableは「ベンダーID」などでインデックス化されていますか?'vendors'の更新は、'last_conn_time'のどのエントリを使用するかによって混乱しているようです。'挿入..重複キー更新last_conn_time...'を使用して、1つのエントリ/ベンダーのみをmemtableに保持することは合理的でしょうか?

于 2012-07-19T14:28:34.160 に答える