MySQL クイックデータ比較テクニック

MySQL クイックデータ比較テクニック

MySQL の運用と保守において、R&D の同僚が 2 つの異なるインスタンスのデータを比較し、違いを見つけたいと考えています。主キーに加えて、すべてのフィールドを比較する必要があります。どうすればよいでしょうか?

最初の解決策は、比較のために 2 つのインスタンスから各データ行を抽出するプログラムを作成することです。これは理論的には可能ですが、比較に時間がかかります。

2 番目の解決策は、各データ行のすべてのフィールドを結合し、チェックサム値を取得して、チェックサム値に従って比較することです。これは実現可能と思われるので、試してみてください。

まず、すべてのフィールドの値を結合し、MySQL が提供する CONCAT 関数を使用する必要があります。CONCAT 関数に NULL 値が含まれている場合、最終結果は NULL になります。したがって、次のように IFNULL 関数を使用して NULL 値を置き換える必要があります。

CONCAT(IFNULL(C1,''),IFNULL(C2,''))

結合するテーブルには多くの行があり、手動でスクリプトを作成するのは面倒です。心配しないでください。information_schema.COLUMNS を使用して処理できます。

## 列名の連結文字列を取得する SELECT
GROUP_CONCAT('IFNULL(',COLUMN_NAME,','''')')
information_schema.COLUMNS から 
ここで、TABLE_NAME='テーブル名';

次のテストテーブルがあると仮定します。

テーブル t_test01 を作成します
(
 id INT AUTO_INCREMENT 主キー、
 C1 INT、
 C2 INT
)

次に、次の SQL を抽出します。

選択
id、
MD5(CONCAT(
IFNULL(id,'')、
IFNULL(c1,'')、
IFNULL(c2,'')、
)) AS md5_value
t_test01より

2 つのインスタンスで実行し、Beyond Compare を使用して結果を比較します。異なる行と主キー ID を見つけるのは簡単です。

データ量が多いテーブルの場合、結果セットも大きくなり、比較が難しくなります。そのため、まず結果セットを縮小してみてください。複数の行の md5 値を組み合わせて MD5 値を計算できます。最終的な MD5 値が同じであれば、これらの行は同じです。異なる場合は、違いがあることを証明します。次に、これらの行を 1 行ずつ比較します。

1,000 行のグループで比較すると仮定します。グループ化された結果を結合する必要がある場合は、GROUP_CONCAT 関数を使用する必要があります。結合されたデータの順序を保証するために、GROUP_CONCAT 関数で並べ替えを追加する必要があることに注意してください。SQL は次のとおりです。

選択
min(id) を min_id として、
max(id) を max_id として、
count(1)をrow_countとして、
MD5(GROUP_CONCAT(
MD5(CONCAT(
IFNULL(id,'')、
IFNULL(c1,'')、
IFNULL(c2,'')、
)) IDで並べ替え
))AS md5_value
t_test01より
GROUP BY (id div 1000)

実行結果は次のとおりです。

最小ID 最大ID 行数 md5値
0 999 1000 7d49def23611f610849ef559677fec0c
1000 1999 1000 95d61931aa5d3b48f1e38b3550daee08
2000 2999 1000 b02612548fae8a4455418365b3ae611a
3000 3999 1000 fe798602ab9dd1c69b36a0da568b6dbb

異なるデータが少ない場合は、数千万のデータを比較する必要がある場合でも、min_id と max_id に基づいて相違のある 1,000 のデータを簡単に見つけ出し、MD5 値を 1 行ずつ比較して、最終的に異なる行を見つけることができます。

最終比較表:

追伸:

GROUP_CONCAT を使用する場合は、MySQL 変数 group_concat_max_len を設定する必要があります。デフォルト値は 1024 で、超過分はステージングされます。

以下もご興味があるかもしれません:
  • MySQL 5.7.20 共通ダウンロード、インストール、設定方法と簡単な操作スキル(解凍版無料インストール)
  • Java Web を使用して MySQL データベースに接続する方法
  • tcpdump を使用して mysql のパケットをキャプチャする方法
  • MySQL数千万の大規模データに対する30のSQLクエリ最適化テクニックの詳細な説明
  • 時間に基づいて日付をクエリするためのMySQL最適化テクニック
  • MYSQL クエリの効率を向上させる 10 の SQL ステートメント最適化テクニック
  • MySQL の一般的な問題とアプリケーション スキルの概要
  • MySQL データ ウェアハウスを保護するための 5 つのヒント
  • MySQL のデバッグと最適化に関する 101 のヒントを共有する
  • MySql SQL最適化のヒントの共有
  • MySQLインジェクションバイパスフィルタリング技術の概要
  • MySQLデータベースの共通操作スキルのまとめ

<<:  nginx のスムーズな再起動を実装する方法

>>:  JS デコレータ パターンと TypeScript デコレータ

推薦する

MySQLテーブル内の重複データをクエリする方法

hk_test(ユーザー名、パスワード) に値を挿入 ('qmf1', '...

Dockerを使用してNextCloudネットワークディスクを展開する方法

NextCloud コンピュータ上の任意のファイルやフォルダを共有し、NextCloud サーバーと...

React で遅延読み込みを使用して最初の画面の読み込み時間を短縮する方法

目次使用インストールルーティングでどのように使用しますか?読み込み速度の比較最近、中間およびバックエ...

Linux trコマンドの使い方

01. コマンドの概要tr コマンドは、標準入力からの文字を置換、圧縮、削除できます。ある文字セット...

Windows サービス 2012 Alibaba Cloud サーバーで MySQL をビルドするときに msvcr100.dll ファイルが見つからないという問題を解決します

解決策1: msvcr100.dll ファイルをダウンロードし (インターネットからソース ファイル...

JavaScriptでカレンダー効果を素早く実装

この記事では、カレンダー効果を素早く実現するためのJavaScriptの具体的なコードを例として紹介...

MySQL が uuid または snowflake id を主キーとして使用することを推奨しない理由の詳細な分析

前書き: MySQL でテーブルを設計する場合、MySQL では UUID や非連続かつ非繰り返しの...

Vueフロントエンドパッケージングの詳細なプロセス

目次1. パッケージ化コマンドを追加する2. パッケージ化されたコードを実行する3. パッケージ化し...

MySQL Innodbの主な機能挿入バッファ

目次挿入バッファとは何ですか?挿入バッファのトリガー条件は何ですか?なぜ一意のインデックスにできない...

HTML と CSS を書くための 6 つの最も効果的な方法

この記事では、効率を向上させ、時間を節約することを願って、最も効果的な 6 つの方法を紹介します。 ...

jsはタイトルと説明のキーワードを検出し、見つかった場合は置換するか他のページにジャンプします。

キーワード 一般タイトルには、クラック、キー、シリアル番号、キージェネレータなどの単語を含めることは...

MySQLプリコンパイル機能の詳細な説明

この記事では、MySQLのプリコンパイル機能について紹介します。具体的な内容は以下のとおりです。 1...

Dockerにlogstashをインストールする詳細な手順

docker-compose.yml を編集し、次のコンテンツを追加します。 バージョン: '...

background-positionプロパティでのパーセンテージ値の使用法の検討

背景位置が背景画像の表示に与える影響この2日間のプロジェクトでホームページの写真を入れ替えていたとこ...

MySQL学習エンジンの詳細な説明、説明、権限

エンジン導入InnodbエンジンInnodb エンジンは、データベース ACID トランザクションを...