MySQL に大量のデータを挿入するときに重複データを除外する方法

MySQL に大量のデータを挿入するときに重複データを除外する方法

序文:

残業の理由は、オンラインにアクセスして、オンライン データベース内の重複データの問題を解決するためです。プログラムにbugが見つかりましたが、簡単に解決できました。オンラインでの重複データの修正は、少し深刻でした。

オンライン ライブラリの 6 つのテーブルに重複データがあり、そのうち 2 つは比較的大きく、1 つは 960,000 を超え、もう 1 つは 300,000 を超えています。以前にも同じ問題を扱ったことがあるため、前回のPython重複排除スクリプトを直接使用しました。スクリプトは非常にシンプルで、データベースに接続し、重複データを見つけて、ループで削除します。

うーん、でも効率が低すぎて、1 秒あたり 1 個、重複データが約 20,000 個以上、推定時間は約 8 時間です。 。 。

自分で考えずに、先人のものを盲目的に頼るのは問題です!なぜ以前はうまくいったのに、なぜ今はうまくいかないのかといつも疑問に思うのも問題です。最近、自分の状態が悪く、探求したり知識を求めたりする意欲を失っていることに気づきました。今日は私にとって目覚めの時であり、ようやく正しい道に戻れたような気がします。

さて、本題に戻りましょう。重複排除の手順については、以下で詳しく説明します。

1. 問題を発見する

テーブル「動物」を作成します(  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `name` varchar(20) デフォルト NULL,  
  `age` int(11) デフォルト NULL,  
  主キー (`id`)  
) ENGINE=InnoDB AUTO_INCREMENT=1 デフォルト CHARSET=utf8 COLLATE=utf8_bin;  
`pilipa_dds`.`student` (`id`, `name`, `age`) に VALUES ('1', 'cat', '12') を挿入します。  
`pilipa_dds`.`student` (`id`, `name`, `age`) に VALUES ('2', 'dog', '13') を挿入します。  
`pilipa_dds`.`student` (`id`, `name`, `age`) に VALUES ('3', 'camel', '25') を挿入します。  
`pilipa_dds`.`student` (`id`, `name`, `age`) に VALUES ('4', 'cat', '32') を挿入します。  
`pilipa_dds`.`student` (`id`, `name`, `age`) VALUES ('5', 'dog', '42') に INSERT INTO します。 


目標:同じnameのデータを削除します。

まず、どのデータが繰り返されているかを確認します。

名前、カウント(1)を選択   
から  
 学生   
グループ化  
名前   
持つ  
 カウント(1) > 1; 


出力:

名前 数(1) 猫 2 犬 2

catおよびdog nameデータが繰り返され、各繰り返されるデータには 2 つのエントリがあります。

繰り返しフィールドがあるテーブルから*を選択(Count(1)>1を持つ繰り返しフィールドでテーブルグループから繰り返しフィールドを選択) 

2.重複データを残さずにすべて削除する

直接削除するとエラーが発生します。

消去   
から  
 学生   
どこ  
 名前 (  
 名前を選択   
 から  
  学生   
 グループ化  
 名前   
持つ  
 カウント(1) > 1) 


エラー:

1093 - FROM 句で更新のターゲット テーブル 'student' を指定できません。時間: 0.016000 秒 


その理由は、このテーブルを更新している間にこのテーブルがクエリされ、このテーブルをクエリしている間にこのテーブルが再度更新されるため、デッドロックが発生するからです。 MySQL では、同じテーブルを更新してクエリするこの操作はサポートされていません。

解決策:更新するデータの列をサードパーティ テーブルとしてクエリし、フィルター処理して更新します。

消去   
から  
 学生   
どこ  
 名前 (  
 選択  
  t.名前   
から  
 ( 学生から名前を選択 GROUP BY NAME HAVING count( 1 ) > 1 ) t) 

3. 削除テーブルから重複データを削除し、1つだけ残す

削除する前に、削除する重複データの種類を確認できます。

選択  
 *   
から  
 学生   
どこ  
 id が (  
 選択  
  t.id   
 から  
 ( SELECT MIN( id ) AS id FROM student GROUP BY `name` ) t   
 ) 


これは何を意味するのでしょうか? まず、 nameでグループ化し、ID が最も小さいデータを見つけます。これらのデータは、保持したいファイア シードです。次に、ID が含まれていないデータをクエリします。これは、削除したい重複データです。

4.重複データを削除し、1つだけ残す

とても簡単です。select select delete置き換えるだけです。

消去   
から  
 学生   
どこ  
 id が (  
 選択  
  t.id   
 から  
 ( SELECT MIN( id ) AS id FROM student GROUP BY `name` ) t   
 ) 


900,000 件以上のレコードを含むテーブルの実行は超高速です。

これで、 MySQL一括挿入時に重複データを除外する方法に関するこの記事は終了です。MySQL で重複データを除外する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MYSQL 必読ノート 第 6 章 データのフィルタリング
  • MYSQLは正規表現を使用してデータをフィルタリングします
  • MySQLデータベースでサポートされているストレージエンジンの比較
  • MySQLはインデックスプッシュダウンを数秒で理解するのに役立ちます
  • Python numpyは複数のループを実装してファイルを読み取り、等間隔でデータをフィルタリングします
  • pandas のデータセット内の特定の値または行を削除またはフィルタリングする方法を詳しく説明してください。
  • AngularJs で orderBy と filter を使用してデータをフィルタリングする方法

<<:  VMware 構成 VMnet8 ネットワーク方法の手順

>>:  レスポンシブWebデザイン学習(3) - モバイルデバイスでのWebページのパフォーマンスを向上させる方法

推薦する

Dockerがコンテナを起動するたびに、IPとホストが指定した操作が実行されます。

序文Dockerを使ってHadoopクラスタを起動するたびに、ネットワークカードの再バインド、IPの...

Linux システムの /etc/fstab ファイルの詳細な解釈

序文 [root@localhost ~]# cat /etc/fstab # #/etc/fsta...

Vueは右上隅の時間表示のリアルタイム更新を実装します

この記事の例では、右上隅の時間表示のリアルタイム更新を実現するためのVueの具体的なコードを紹介しま...

NodeはMySQLに接続し、追加、削除、変更、チェックのための実装コードをカプセル化します。

目次ノードはMysqlに接続しますMySQLモジュールをインストールするMySQLに接続するよく使わ...

MySQL 8.0.22 winx64 のインストールと設定方法のグラフィックチュートリアル

MySQL-8.0.22-winx64のデータベースインストールチュートリアルは参考になります。具体...

Docker Tomcat のアクセス インターフェイスが表示されないのはなぜですか?

質問:オリジン サーバーはターゲット リソースの表現を見つけることができないか、既存の表現を公開した...

Vueエンジニアがカプセル化しなければならない埋め込み命令の知識のまとめ

目次序文指導の基本フック機能フック関数のパラメータ文章使い方とアイデア成し遂げる汎用性を高める要約す...

Linux/CentOS システムでネットワーク時間を同期する 2 つの方法の詳細な説明

ハードウェア上の理由により、機械は標準時間にある程度追いつけない場合があり、その誤差は 1 か月で数...

MySQLクエリプランでken_lenの値を計算する方法

key_lenの意味MySQL では、次に示すように、explain を使用して SQL ステートメ...

CSSでよく使われるフォントスタイルを設定することで様々なフォントの変更が可能(例詳細説明)

CSS フォント プロパティは、テキストのフォント ファミリ、サイズ、太字、スタイル (斜体など)...

Linux システムが VMware にインストールされているかどうかを確認する方法

現在の Linux システムが VMware にインストールされているかどうかを確認する方法を教えて...

MySQLを閉じることができない問題を解決する方法

mysql が閉じない場合の解決策:コンピュータのタスクバーを右クリックしてタスクマネージャーを開き...

vue-element-admin プロジェクトのインポートとエクスポートの実装

vue-element-admin インポートコンポーネントのカプセル化テンプレートとスタイルまず、...

Vueはechartsを使用して組織図を描画します

昨日、円形のプログレスバー (Vue 円形プログレスバーを参照してください) についてブログを書きま...