MySQL で重複を削除するには、distinct または group by を使用する必要がありますか?

MySQL で重複を削除するには、distinct または group by を使用する必要がありますか? パフォーマンス比数量が少なく、種類も少ない少量、多品種カテゴリの数が多いインデックスなしやや優れている明確な方が優れているインデックスありやや異なるやや異なるやや異なるやや異なるやや異なる

重複排除のシナリオでは、インデックスが追加されていない場合は、distinct が使用される可能性が高くなりますが、インデックスが追加されている場合は、distinct と group by の両方を使用できます。

要約する

これは、MySQL の重複排除に distinctive を使用するか group by を使用するかについての記事です。記事はこれで終わりです。mysql deduplication distinctive group by の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL 選択最適化ソリューションに関する簡単な説明
  • MySQL で結果を選択して更新を実行する例のチュートリアル
  • MySQLの読み書き分離により挿入後にデータが選択されなくなる問題を解決
  • MySQL SELECT文の実行方法
  • MySQL で distinct メソッドを使用する詳細な例
  • MySQL における distinct と group by の違い
  • MySQLのLIMIT文について詳しく説明します
  • union (all) と limit および exists キーワードの使用法を理解するための MySQL シリーズチュートリアル
  • MySQL のクエリパフォーマンスに対する制限の影響
  • MySQL での select、distinct、limit の使用

序文

group by と distinctive のパフォーマンス比較について: インターネット上の結論は次のとおりです。distinct はインデックスなしの少量データではパフォーマンスが良く、group by は大量データではパフォーマンスが良くなります。インデックス付きの group by の方がパフォーマンスが良いです。インデックスを調べるとき、グループ化の種類が少ないほど、distinct は高速になります。導き出された結論をオンラインで検証します。

準備フェーズ中にクエリキャッシュを無効にする

MySQL でクエリ キャッシュが設定されているかどうかを確認します。テスト結果に影響を与えないようにするには、クエリ キャッシュをオフにする必要があります。

'%query_cache%' のような変数を表示します。 

ここに画像の説明を挿入

クエリ キャッシュが有効かどうかを確認します。これは、 query_cache_typequery_cache_sizeによって決まります。

  • 方法 1: クエリ キャッシュをオフにするには、my.ini を見つけてquery_cache_type :\ProgramData\MySQL\MySQL Server 5.7\my.ini 構成ファイルを変更し、 query_cache_type=0或2変更する必要があります。
  • 方法 2: query_cache_sizeを 0 に設定し、次のステートメントを実行します。
グローバル query_cache_size を 0 に設定します。

方法 3: クエリ キャッシュをオフにしたくない場合は、 RESET QUERY CACHE使用することもできます。

現在のテスト環境では、query_cache_type=2 はオンデマンドのクエリ キャッシュを意味します。デフォルトのクエリ モードはキャッシュしません。キャッシュが必要な場合は、クエリ ステートメントにsql_cache追加する必要があります。

データ準備

テーブルt0には少量種類少が格納されます。

存在する場合はテーブルを削除します t0;
テーブルt0を作成(
id bigint 主キー auto_increment、
varchar(255) は null ではない
) エンジン=InnoDB デフォルト文字セット=utf8mb4 照合=utf8mb4_bin;
1
2
3
4
5
プロシージャ insert_t0_simple_category_data_sp を削除します。
区切り文字 //
プロシージャ insert_t0_simple_category_data_sp(IN num int) を作成します。
始める
@i = 0 に設定します。
@i < num の間
	t0(a) に値を挿入します(truncate(@i/1000, 0));
 @i = @i + 1 と設定します。
終了しながら;
終わり
//
insert_t0_simple_category_data_sp(100000) を呼び出します。

テーブルt1には少量種類多格納されます。

存在する場合はテーブル t1 を削除します。
t0 のようにテーブル t1 を作成します。
1
2
プロシージャ insert_t1_complex_category_data_sp を削除します。
区切り文字 //
プロシージャ insert_t1_complex_category_data_sp(IN num int) を作成します。
始める
@i = 0 に設定します。
@i < num の間
	t1(a) に値を挿入します(truncate(@i/10, 0));
 @i = @i + 1 と設定します。
終了しながら;
終わり
//
insert_t1_complex_category_data_sp(10000) を呼び出します。

t2 テーブルには大量種類多

存在する場合はテーブルを削除します t2;
t1 と同じようにテーブル t2 を作成します。
1
2
プロシージャ insert_t2_complex_category_data_sp を削除します。
区切り文字 //
プロシージャ insert_t2_complex_category_data_sp(IN num int) を作成します。
始める
@i = 0 に設定します。
@i < num の間
	t1(a) に値を挿入します(truncate(@i/10, 0));
 @i = @i + 1 と設定します。
終了しながら;
終わり
//
insert_t2_complex_category_data_sp(5000000) を呼び出します。

テストフェーズ

少量のデータを検証する

インデックスされていない

プロファイリングを 1 に設定します。
t0 から別の a を選択する。
プロフィールを表示します。
t0 から a を選択し、 a でグループ化します。
プロフィールを表示します。
テーブル t0 を変更し、インデックス `a_t0_index`(a) を追加します。 

ここに画像の説明を挿入

これは、型数が少なくデータが少ない場合、インデックスなしでは、distinct と group by のパフォーマンスはほぼ同じであることを示しています。

インデックスを追加

テーブル t0 を変更し、インデックス `a_t0_index`(a) を追加します。

上記のようなクエリを実行した後

ここに画像の説明を挿入

これは、タイプ数が少なくデータが少ない場合、インデックスを追加すると、distinct と group by のパフォーマンスがほぼ同じであることを示しています。

少量で多くの種類のデータがインデックス化されていないことを確認する

上記と同様のインデックスなしのクエリを実行した後

ここに画像の説明を挿入

このことから、少量のデータで種類が多く、インデックスがない場合、distinct のパフォーマンスは group by よりもわずかに高いものの、その差は大きくないことがわかります。

インデックスを追加

テーブル t1 を変更し、インデックス `a_t1_index`(a) を追加します。

同様のインデックスなしのクエリを実行した後

ここに画像の説明を挿入

このことから、データ量が少なく型が多い場合、インデックスを追加すると、distinct と group by のパフォーマンスはほぼ同じであることがわかります。

大量のデータを検証する

インデックスされていない

count(1)をt2から選択します。 

ここに画像の説明を挿入

上記と同様のインデックスなしのクエリを実行した後

ここに画像の説明を挿入

これは、多くの種類のデータが大量にあり、インデックスがない場合、DISTINCT の方が GROUP BY よりもパフォーマンスが優れていることを示しています。

インデックスを追加

テーブル t2 を変更し、インデックス `a_t2_index`(a) を追加します。

上記の同様のインデックスクエリを実行した後

ここに画像の説明を挿入

これは、多くの種類の大量のデータの場合、インデックスを追加すると、distinct と group by のパフォーマンスがほぼ同じであることを示しています。

要約する

<<:  Tencent Cloud Serverをゼロから導入する方法

>>:  Vue+echarts でプログレスバーのヒストグラムを実現

推薦する

Reactでwindow.print()を使用した際にページが応答しなくなる問題の解決記録について

目次1. 問題の背景: 2. 問題の原因: 3. 問題解決:要約: 1. 問題の背景: window...

MySQLとOracleのメタデータ抽出例分析

目次序文メタデータとは参照文書アドレスまずはMySQLについてお話しましょうOracleについて話し...

docker CMD/ENTRYPOINT が sh スクリプトを実行する問題の解決策: not found/run.sh:

Dockerfile の設定に問題はありませんが、ENTRYPOINT コマンドを実行するとエラー...

H5でクリックされたときにaタグの背景色をキャンセルする方法

1. モバイル端末でクリックされたときにタグの青色を解除する { -webkit-tap-highl...

HTML フォーム送信アクションと URL ジャンプアクションの違い

フォームのアクションは URL ジャンプとは異なります。フォームはバックグラウンドにデータを渡すこと...

JS の効率的なマジック演算子の概要

JavaScript は現在、毎年新しいバージョンがリリースされており、より便利で効率的な新しい演算...

Mysql systemctl start mysqld によって報告されるエラーの解決策

エラーメッセージ:制御プロセスがエラー コードで終了したため、mysqld.service のジョブ...

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

MySQL 8.0.12のインストールと設定方法を記録してみんなで共有します。 1. インストール1...

mysql 8.0.18.zip のインストールと構成方法のグラフィック チュートリアル (Windows 64 ビット)

以前にインストールされたバージョンのデータベースをアンインストールする方法については、この記事を参照...

Javascript と Vue を組み合わせて、あらゆる迷路画像の自動パス検索を実現します。

目次序文2次元配列、一方向基本インターフェースのマッピング幅優先、包括的検索マップ編集経路探索アルゴ...

MySQL の異常なエラー ERROR: 2002 を解決する方法

最近、MySQL の起動中にエラーが発生しました。エラー メッセージは次のとおりです。 エラー 20...

HTMLページ間でパラメータを渡すフロントエンド方式の詳細な説明

プロジェクトでよくある状況として、案件リストなどのリストが存在することがあります。リスト内の項目をク...

外部ネットワークアクセスを許可するためのMysql5.6の設定手順の詳細を共有する

最近、MySQL 5.6 を導入しましたが、デフォルトでは MySQL はローカル サービスのみを許...

JavaScript クロージャの説明

目次1. クロージャとは何ですか? 2. クロージャの役割2.1) メモリ2.2) プライベート変数...

Linux システムで grub.cfg ファイルの破損を修復する手順

目次1. grub.cfg ファイルの紹介1. grub.cfg ファイルの場所2. grub.cf...