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

推薦する

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

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

WindowsとLinux間でファイルを転送する方法

WindowsとLinux間のファイル転送(1)WinSCPを使用して、WindowsファイルをLi...

Vscode が Ubuntu にリモート接続する際のエラー問題の解決方法

1. 事件の背景:仕事上、Ubuntu への vscode リモート接続を使用する必要があります。 ...

Linux での感嘆符コマンド (!) の使用の概要

序文最近、弊社では mbp の設定をしており、ssh を使うことが多くなりました。複雑なコマンドを書...

Linux にバイナリ MySQL をインストールして MySQL パスワードをクラックする方法

1. システムに必要な libaio ソフトウェアがインストールされていることを確認します。インスト...

Docker で MySQL クラスターを構築する方法の例

Docker の基本的な手順:アップデートパッケージ yum -y アップデートDocker仮想マシ...

新しい ECMAscript オブジェクト機能の紹介

目次1. オブジェクトのプロパティ1.1 属性表記2. プロパティ名を計算する3.オブジェクトメソッ...

Linux 時間サブシステムの時間表現例の詳細な説明

序文Linux カーネルでは、元のコードとの互換性を保つため、または特定の仕様に準拠するため、また現...

TypeScriptのインデックスシグネチャの理解に関する簡単な説明

目次1. インデックス署名とは何ですか? 2. インデックス署名構文3. インデックス署名に関する注...

Navicat が MySQL に接続するときに発生する 1045 エラーの解決方法

ローカル データベースに接続すると、Navicat for MySQL は以下のように 1045 エ...

MySQL 5.7.20 無料インストールバージョンの設定方法グラフィックチュートリアル

インターネット上で多くの関連チュートリアルを見てきましたが、インストール プロセスにはまだいくつかの...

PHP クラスにおける static と self の違いの簡単な分析

メソッドが定義されているクラスに応じて、現在のクラスへの静的参照を取得するには、self:: または...

CSSのoutline-offsetプロパティを使用してプラス記号を実装する

次のような初期コードがあると仮定します。 <!DOCTYPE html> <htm...

CSS3 フィルターを使用して PNG 画像の色を変更するサンプル コード

この方法は、CSS3のdrop-shadow filterを使用して、png画像の不透明部分に任意の...