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

推薦する

Webpack4プラグインの実装原理についての簡単な説明

目次序文知る練習すれば完璧になる序文wabpack では、ローダーの他にプラグインがコア機能です。プ...

MySQL インデックスの種類 (通常、ユニーク、フルテキスト) の説明

MySQL のインデックスの種類には、通常のインデックス、一意のインデックス、全文インデックスがあり...

Vue3 の動的コンポーネントはどのように機能しますか?

目次1. コンポーネントの登録1.1 グローバル登録1.2 グローバルコンポーネントの登録プロセス1...

Docker インストール rocketMQ チュートリアル (最も詳細)

RocketMQ は、Alibaba が設計した分散型のキューベースのメッセージング ミドルウェア...

Linux ssh サーバーの構成コード例

LinuxホストにSSHサーバーをインストールするには、次のターミナルコマンドを使用します: sud...

MySql8.0 のトランザクション分離レベルエラーの問題を解決する

目次MySql8.0 トランザクション分離レベルエラーの表示質問コマンドは次のように変更されますMy...

CentOS 8.4 での Docker パッケージのオフラインインストールの問題について

使用する仮想マシンは、サーバー環境をシミュレートする CentOS 8.4 です。外部ネットワークに...

MySQL Server 8.0.13.0 インストールチュートリアル(画像とテキスト付き)

MySQL 6.1.3 をベースにした 8.0.13 をインストールします。 MySQL 8.0....

HTML 特殊文字変換表

キャラクター小数点文字番号エンティティ名---未使用空間---スペースバー! ! ---感嘆符「 」...

webpack と rollup を使用してコンポーネント ライブラリをパッケージ化する方法

序文以前、ローディングスタイルのコンポーネントを作成しました。コードの再利用性を実現するために、この...

MySQL ページングパフォーマンスの調査

一般的なページング方法: 1. エスカレーター方式エスカレーター方式では通常、前のページ/次のページ...

MySQL 5.7.17 圧縮バージョンのインストールノート

この記事では、参考までにMySQL 5.7.17圧縮版のインストール手順を紹介します。具体的な内容は...

XAML でボタンを円として再描画する方法

XAML レイアウトを使用する場合、インターフェイスを Metro 風にするために、一部のボタンでは...

Node.jsサービスDockerコンテナアプリケーション実践のまとめ

この記事では、Docker コマンドの使用とインストールについては説明しません。Docker を基礎...

MySQL Binlog ログ処理ツールの比較分析

目次運河マクスウェルデータバスAlibaba Cloud のデータ転送サービス (DTS)運河ポジシ...