9

主キーが。の非常に大きなテーブルがありBINARY(20)ます。

テーブルには約1700万行があります。cronジョブは、1時間ごとに、構文を使用して50,000もの新しいエントリをこのテーブルに挿入しようとしON_DUPLICATE_KEY_UPDATEます。

cronjobの各挿入には、1,000個の値が含まれます(複数挿入)。このクエリからテーブルに挿入された行数を取得するにはどうすればよいですか?約1700万行あり、クエリが高すぎるため、前後の行数をカウントできません。

マニュアルでは、mysqlは、挿入された行に対して影響を受ける行数はで1あり、更新されたフィールドに対してはであると述べています2。つまり、1000 INSERT ON DUPLICATE KEY UPDATEクエリでは、1000〜2000の範囲の行に影響を与える可能性がありますが、この数から挿入されたレコードの数を教えてください。

どうすればこれを克服できますか?

ありがとう

4

2 に答える 2

10

挿入の数は、2000 から影響を受ける行の数を引いたものになります。より一般的に:

(numberOfValuesInInsert * 2) - mysql_affected_rows()

編集:

tomasが指摘しているように、MySQL のドキュメントでは実際に次のように述べられています。

ON DUPLICATE KEY UPDATE では、行が新しい行として挿入される場合、行ごとの影響を受ける行の値は 1、既存の行が更新される場合は 2、既存の行が現在の値に設定される場合は 0 です

[鉱山を強調]

したがって、既存の行を同じ値に設定する可能性がある場合、更新された行と挿入された行の数を区別することは不可能です。これは、2 つの挿入が、異なる値での 1 つの更新 + 同じ値での 1 つの更新と区別できないためです。

于 2012-06-07T04:28:48.817 に答える
7

あなたの仕事が 1000 の挿入を行うとき、一部は純粋な挿入であり、一部は ON_DUPLICATE_KEY_UPDATE があるため更新です。したがって、最初の式が得られます

(1) 挿入 + 更新 = 挿入された行数 (この場合は 1000)

mysql_affected_rows の値が 1350 になる簡単な例を取り上げます。Insert の場合は 1 の値を、update の場合は 2 の値を my_sql_affected_rows に集計するためです。次の式が得られます。

(2) 挿入 + 2 * 更新 = my_sql_affected_rows (この場合は 1350) .

(2) - (1) を引きます。あなたが得る

(3) Updates = my_sql_affected_rows - 挿入された行数

更新 = 1350 ~ 1000 (この例では)。

更新 = 350 。

式 (1) の Updates の値を代入すると、次のようになります。

インサート = 650

したがって、更新の数を取得するには、式 (3) を直接使用するだけで済みます。

于 2012-06-07T06:01:14.930 に答える