MySQL 最適化のヒント: 重複削除の実装方法の分析 [数百万のデータ]

MySQL 最適化のヒント: 重複削除の実装方法の分析 [数百万のデータ]

この記事では、MySQL 最適化のヒントで重複したエントリを削除する方法を例を使って説明します。ご参考までに、詳細は以下の通りです。

重複排除に関しては、特に出力量が大きい場合には頭が痛くなってしまいます。結局のところ、私はプロの DB ではないので、自分に合った重複排除方法を考え出すことしかできません。

まず、通常の最初の段落に従い、having 関数を使用して重複をチェックし、重複を 1 つずつ削除します。重複を検出するための SQL の書き方を私に聞かないでください。それはご存知でしょう。 。 。重複が少数の場合はこれで問題ありません。何千、何万もの異なるデータの重複があったらどうなるでしょうか? 。 。

完了したら、クエリに having 関数を使用する場合、元の SQL は次のようになると考えてみましょう。

count>1 を持つ `name` の文グループから、`name`,count(*) を count として選択します。

実行してみて実感できますが、データが500万個くらいあると、そのスピードはごま油のようです。 。 。

ただし、実行速度の最適化を考慮せずに、このステートメントを使用して配列から重複する項目を削除することを検討しましょう。まず、重複データを削除するときにどのデータを使用する必要があるかを知る必要があります。 IDは確かで、その後にフィルタリング条件ですよね?では、上記の SQL によってクエリされたデータには何が欠けているのでしょうか? ID です。 。 。次に、このフィールドを追加して試してみましょう。

count>1 を持つ `name` の文グループから、id、`name`、count(*) を count として選択します。

その結果、id、name、count の 3 つのフィールドが表示されます。具体的な効果を確認するには、自分で実行してみてください。このデータに基づいて重複を削除できます。

具体的な SQL 設計は、クエリした ID ではない ID を削除しますが、名前の値はクエリした値です。データは 1 つではないため、プログラムで処理する必要があります。すべての ID はカンマで連結され、名前の値は引用符とカンマで処理されます。その後、使用できます。例を以下に示します。

文から、IDが(1,2,3)に含まれず、名前が('a','b','c')に含まれるものを削除します。

データが多すぎる場合は、スクリプトに書き込み、完了したらバッチで操作を実行できます。重複を削除できるようになりましたが、速度にはまだ問題があります。次に、この SQL を最適化して速度を上げる方法を検討する必要があります。これで完了です。

SQL の実行速度を向上させるには、常識的に考えて、まずインデックスについて考えます。さて、これ以上何も言わずに、まずインデックスを作成しましょう。しかし、そのフィールドを作成するのはどうでしょうか? ? ?これはまた別の問題です。

この原則は、名前フィールドによって区別できるフィールドに基づいています。たとえば、名前フィールドにはブランド名が保存され、各ブランドの業界​​を保存する業界フィールドがあるため、業界フィールドにインデックスを作成しました。もちろん、もっと適切なものもあるでしょうが、それは考え方次第です。では、早速、最適化された SQL を見てみましょう。

業界 = 'ドリンク' の文から、id、`name`、count(*) を count として選択し、count>1 を持つ `name` でグループ化します。

結果は次のとおりです。

結果には何が表示されますか? インデックスが使用中であることがわかります。 。 。スピードに関しては、私が言わなくても皆さんは理解しているはずです。その後、プログラムを使用してすべての ID をコンマで連結し、名前の値を引用符とコンマで処理します。その後、重複を削除するタスクに進むことができます。効率が大幅に向上しました。 。 。

ただし、読者によっては、いいね!などの条件を含む条件を使用してインデックスが無効になる場合があります。その場合は、データを分類し、各カテゴリのデータを個別にチェックし、すべてのデータをクエリした後、プログラムを使用して重複をチェックし、削除が必要なデータを削除します。

付録: MySQL RAND クエリの最適化とランダム クエリの最適化

ランダムクエリに関しては、誰もが rand() 関数を使用することは知っていますが、データ量が一定レベルに達すると、クエリの効率は想像に難くありません。だから何?このクエリを最適化することを検討してみましょう。

私の最適化方法は、プログラムを使用してランダム化し、制限を使用して値を取得することです。大まかな考え方を記録しておきましょう。

まず、条件を満たすデータの数を照会し、次に PHP の rand 関数を使用してこの数値範囲内の値をランダムに選択し、直接照会します。

例のSQL:

select count(*) from test where $where; )

$offset = rand(0,$count)

select * from test where $where limit $offset,1; (必要なデータを照会する)

誰でも試すことができます。約 500 万個のデータの場合、クエリ速度は MySQL RAND 関数クエリ方法よりも少なくとも 10 倍高速です。

さて、今回の共有はこれですべてです。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキル」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL の分析: 単一テーブルを区別し、複数テーブルをグループ化して重複レコードを削除するクエリ
  • フィールド内の重複情報を削除するmysql SELECT文
  • MySQLで重複データを削除する詳細な例
  • 1つのSQL文でMySQLの重複排除が完了し、1つが保持されます。
  • MySQLの重複排除方法
  • MySQL 開発スキル: JOIN 更新とデータ重複チェック/重複排除
  • Mysql 重複データを削除 Mysql データ重複排除
  • MySQL における重複排除の 2 つの方法とサンプル コードの詳細な説明
  • 重複したMySQLテーブルをマージして削除する簡単な方法
  • MySQLの重複排除操作を極限まで最適化する方法
  • MySQL の自己結合重複排除に関する注意事項

<<:  Vue 開発ツリー構造コンポーネント (コンポーネント再帰)

>>:  nginx で正規表現を使用してワイルドカードドメイン名を自動的に一致させる方法

推薦する

IDEA を MYSQL データベースに接続するための構成時に失敗する問題の解決策

この記事では、主に、IDEA を MYSQL データベースに接続するための構成時に失敗する問題の解決...

SeataがMySQL 8バージョンを使用できない問題を解決する方法

考えられる理由: Seata が MySQL 8 をサポートしない主な理由は、接続ドライバーがバージ...

Ubuntuのバックアップ方法(4種類)のまとめ

方法1:リスピンを使用するには、次の手順に従ってください。 sudo add-apt-reposit...

MySQL 5.7 の同時レプリケーションにおける暗黙のバグの分析

序文当社の MySQL オンライン環境のほとんどはバージョン 5.7.18 を使用しています。このバ...

JavaScript 変数の昇格についての簡単な説明

目次序文1. どのような変数が促進されますか? 2. 可変プロモーションがあるのはなぜですか? (1...

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

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

Reactにおけるフックの一般的な使用法

目次1. フックとは何ですか? 2. フックはなぜ現れるのでしょうか? 3. よく使われるフックは何...

すべてのウェブ開発者が知っておくべき61のこと

通常、全員のスピーチを最初から最後まで読む必要があります。ただし、Stack Overflow には...

js のマクロタスクとマイクロタスクについての簡単な説明

目次1. JavaScriptについて2. JavaScript イベントループ3. マクロタスクと...

CSS3 での 2D および 3D 変換の実装

CSS3 は、要素の 2D 平面変換と視覚的な 3D 空間変換を実装します。2D 変換はより頻繁に使...

XHTML CSSを使用して正式なブログを書く

ブログの正式名称は「Web log」で、中国語で「ネットワークログ」を意味します。後にブログに短縮さ...

重複データの処理に関するMySQL学習ノート

MySQLは重複データを処理します一部の MySQL テーブルには重複レコードが含まれている場合があ...

vue keep-alive の簡単な概要

1. 機能主にコンポーネントの状態を保持したり、再レンダリングを回避したりするために使用されます。 ...

MySQLのROUND関数の丸め演算における落とし穴の分析

この記事では、MySQL の ROUND 関数を使用した丸め操作の落とし穴を例を使って説明します。ご...

画像プレビュー付きのアップロードフォームの完全な HTML

画像プレビュー機能付きのアップロードフォーム、完全なHTMLコードは次のとおりです。 <htm...