2016-07-22 11 views
1

私は多くのユーザーと数百のクリック/分を挿入する分析プラットフォームを持っています。MySQLに重複を挿入しないようにするには?

時には、同じクリックが同じ秒間にデータベースに挿入され、もう1つの複製となることがあります。

私は、テーブルが同じ値を持っているかどうかをチェックし、それが見つかった場合に他のテーブルを挿入しないようにするシステムを持っています。

しかし、このケースでは、正確に同じミリ秒でDBに挿入されているように見えます。

ここでは何ができますか?

+4

チェックインしないでください。あなたが見つけているように、それは競争条件の対象です。一意のキーを使用します。 DBにユニークさを適用させます –

+0

2つのオプションがあります。データベースに重複キーがあり、重複キー更新を使用します。もう1つはINSERT IGNOREです。データベースに既に存在する場合は無視します。 – nniicc

+0

クリックを記録している場合彼らが起こった、私はあなたが同時に起こったものを含む何人を知りたいと思います。その場合、クリックカウントを挿入し、 'ON DUPLICATE'節を増やしたい場合があります。 – Uueerdo

答えて

2

私のお気に入り:ユニークキー(s)は、インサートを禁止するために、あらかじめ設定されているinsert ignore myTable (col1, col2, ...) ...

。それはあなたがそれほど気にしていないように見えますが、最終結果が二重ではないことをあなたが気にするほど以前に挿入されていたようです。

注:ユニークなキーが複数列のキー(複合)

についてinsert ignore警告の言葉になりますそれは行ことを知っておく必要があり敏感なシステムのためにその波及効果を慎重に考えずに実装すべきではありません本当にすでにそこにあった。 「そこにいることを確認する」には理想的です。

オプションB:一つはhereのように、意図ロックに見えるが、あなたの特定のユースケースのために作られた可能性があります。 INNODB行レベルのロックを指差して操作してください。すばらしいですが、もちろんテーブルロックではありません。ほとんどのものはトレードオフを伴います。ロックの欠点は並行性の低下です。

オプションC:気分が悪い(時には私)。これは、雇用され、後でピア・バックラッシュを起こさないことを望むなら、私がやることです。 Insert ... on Duplicate Key UpdateIODKU)を実行し、touchesのような偽の列があります。これは、IODKUの更新部分のインクリメントに使用されます。以下の例:

insert myTable (col1, col2, col3) values (p1,p2,p3) 
on duplicate key update touches=touches+1; 

上記は、最も単純な形式になります。下のビューには、私は「IODKUの更新部」に複数の列を気にC#に使用するものですが、ちょうどそれが誰利益あれば、ということを示すために:

enter image description here

IODKUの最終的な思考を: 「衝突」を引き起こす固有のキー(プライマリまたはユニークなキー)を持つことが必須です。したがって、ステートメントは、挿入または更新を実行するかどうかを知っています。このようなユニークなキーの衝突がなければ、新しい行が挿入されます。

オペレーションの問題に戻ると、システムでロックされていない可能性が高いため、並行性が高いためです。

0

システムのアーキテクチャでは、2層ソリューションを作成できます。まず、重複データが挿入される一時テーブル。テンポラリテーブルの名前にはシャーディングパラメータ(たとえば、時間数)を含めることができます。システムは定期的に一時表から主記憶域表にデータをエクスポートし、重複データを破棄します。次に、一時表を破棄できます。

関連する問題