MySQLが内部一時テーブルを使用するタイミングについて簡単に説明します。

MySQLが内部一時テーブルを使用するタイミングについて簡単に説明します。

組合執行

分析を簡単にするために、次のSQLを例として使用します。

テーブル t1 を作成します ( id INT 主キー、 a INT、 b INT、 INDEX ( a ) );

デリミタ;;
CREATE PROCEDURE idata ( ) BEGIN
宣言する
        私はINT;
 i = 1 に設定します。
 その間
   ( i <= 1000 ) する
   t1に挿入
  価値観
   ( 私、 私、 私 );
  i = i + 1 を設定します。
 終了しながら;
 終わり;;

区切り文字 ;
idata() を呼び出す。

次に次のSQLを実行します

(select 1000 as f) 結合 (select id from t1 order by id desc limit 2);

この SQL ステートメントのセマンティクスは、2 つのサブクエリの結合を取り、重複を削除することです。

ご覧のとおり、2 行目のキーはプライマリです。つまり、2 番目のサブクエリはインデックス ID を使用します。 3 行目の Extra フィールドは、ユニオン サブクエリを実行するときに一時テーブルが使用されることを示します。
このステートメントの実行フローは次のとおりです。
1) 主キーフィールドである整数フィールド f を 1 つだけ持つ一時メモリ テーブルを作成します。
2) 最初のサブクエリを実行し、1000を一時テーブルに格納します。
3) 2 番目のサブクエリを実行し、最初の行 id=1000 を取得して、一時テーブルに挿入しようとします。ただし、値 1000 は一時テーブルに既に存在するため、一意制約に違反し、挿入は失敗します。次に、2 番目の行 999 を取得し、一時テーブルに正常に挿入します。
4) 一時テーブルから行ごとにデータを取得し、結果を返して、一時テーブルを削除します。結果には 1000 と 999 の 2 つのデータが含まれます。
ご覧のとおり、一時テーブルはデータを一時的に保存する役割を果たし、ユニオン重複排除のセマンティクスを実現する一意制約があります。

グループ化

一時テーブルを使用するもう1つの一般的な例は、group byです。次のSQLを見てみましょう。

t1 から id%10 を m として選択し、count(*) を c としてグループ化し、m でグループ化します。

このステートメントは、テーブル t1 内のデータを id%10 でグループ化し、出力する前に m の結果で並べ替えます。

「追加」フィールドには、次の 3 つの情報が表示されます。

1) インデックスの使用。このステートメントはカバー インデックスを使用し、インデックス a を選択することを示します。
2) 一時テーブルが使用されていることを示す、temporary の使用。
3) filesort を使用するにはソートが必要です。

このステートメントの実行フローは次のとおりです。

1) フィールド m と c を持つ一時メモリ テーブルを作成します。主キーは m です。
2) テーブルt1のインデックスaをスキャンし、リーフノードのid値を1つずつ取り出し、id%10の結果を計算し、それをxとして記録します。

  • 一時テーブルに主キー x がない場合、レコード (x,1) を挿入します。
  • テーブルに主キー x を持つ行がある場合は、主キー x を持つ行の c 値に 1 を加算します。

3) トラバーサルが完了したら、フィールドmに従ってソートして結果を取得します。

メモリ内の一時テーブルのサイズには制限があります。パラメータ tmp_table_size はこのメモリ サイズを制御します。デフォルトは 16M です。メモリ内の一時テーブルが上限に達すると、メモリ内の一時テーブルはディスク上の一時テーブルに変換されます。ディスク上の一時テーブルのデフォルト エンジンは InnoDB です。テーブルに大量のデータがある場合、クエリは大量のディスク領域を占有する可能性があります。

MySQL が内部一時テーブルを使用する場合についての説明はこれで終わりです。MySQL 内部一時テーブルの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL でよく使用されるデータベースとテーブル シャーディング ソリューションの概要
  • MySQLパーティションテーブルは月別に分類されています
  • MySQLはデータテーブル内の既存のテーブルを分割します
  • MySQL テーブル分割後にスムーズにオンラインになる方法
  • MySQLシリーズ マルチテーブル結合クエリ92および99構文例詳細チュートリアル
  • MySQL内部一時テーブルの具体的な使用法
  • Python で MySQL テーブル情報を収集して集計する詳細な例
  • MYSQLテーブルの包括的な概要

<<:  Linux での Hbase のインストールと設定のチュートリアル

>>:  ろうそくを溶かす(水滴)サンプルコードを実現する純粋な CSS

推薦する

カスタム変数を使用した MySQL クエリの最適化

目次並べ替えクエリの最適化変更されたばかりのデータ行を繰り返し取得しないようにする遅延ロードされた結...

HTML テーブルレイアウト例の説明

HTML ドキュメント内の要素は次々に配置され、ブロックレベル要素の前後に改行が追加されるだけで、合...

中国のウェブサイトユーザーエクスペリエンスランキング

<br />ユーザーエクスペリエンスは中国のウェブサイトでますます重視されており、ユーザ...

USE DB 輻輳に対する MySQL ソリューションの詳細な説明

障害に遭遇すると、障害の根本的な原因を考えるのではなく、障害を解決する方法を考えることがよくあります...

jQuery を使用して、iframe 下の無効なページ アンカー ポイントの問題を修正する

適用シナリオ: iframe ページにスクロール バーがなく、親ウィンドウにスクロール バーが表示さ...

Vueの計算プロパティの詳細な説明

1. 計算属性とは何ですか? 簡単に言えば、計算された結果が属性に保存されるもので、キャッシュとして...

Dockerイメージの作成、アップロード、プル、デプロイを理解するための記事

目次1. 画像1. 鏡とは何ですか? 2. 画像の構成と目的(1) Dockerファイル(2)スクラ...

MacOS に MySQL 8.0 をインストールして MySQL にログインする方法

公式チュートリアルに従って、インストール パッケージをダウンロードし、[インストール] をクリックし...

MySQLにおけるMTRの概念

MTR は Mini-Transaction の略です。名前が示すように、これは「最小のトランザクシ...

JavaScript でシンプルなタイマーを実装する

この記事では、参考までに簡単なタイマーを実装するためのJavaScriptの具体的なコードを紹介しま...

ページ リファクタリング スキル - Javascript、CSS

JS、CSSについてCS: ...上部のスタイルシートCSS式を避ける外部JS、CSSの使用JSと...

MySQLデータベースでスロークエリログを有効にする方法の詳細な説明

データベースはスロークエリログを有効にします設定ファイルを変更する設定ファイルmy.iniに次の2つ...

MySQLトリガーの簡単な使用例

この記事では、例を使用して MySQL トリガーの簡単な使用方法を説明します。ご参考までに、詳細は以...

ファイル操作のためのLinuxシステムコール

目次1. ファイルを開くパラメータの紹介2. ファイルの読み取り3. ファイルを書き込む4. 閉じる...

Docker 階層化パッケージを使用して Spring Boot を設定する方法

Spring Boot プロジェクトでは、Docker コンテナ、jar、war の階層化パッケージ...