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

推薦する

W3Cチュートリアル(16):その他のW3Cの活動

このセクションでは、その他の重要かつ興味深い W3C アクティビティの概要を説明します。このセクショ...

jQueryはシンプルなカルーセル効果を実装します

みなさんこんにちは。今日はカルーセルの実装についてお話しします。私が作成したカルーセルの効果は次のと...

AngularパイプラインPIPEの紹介と使い方

序文PIPE、パイプラインと翻訳されます。 Angular パイプは、HTML コンポーネントで宣言...

Dockerコンテナはルーティングを介して直接通信し、ネットワーク通信を実現します。

概要Docker 自体の現在のデフォルト ネットワークについては、単一ホスト上の異なる Docker...

CSSの一般的なプロパティ

CSS の背景: background:#00ffee; //背景色を設定するbackground-...

jQueryの競合問題を解決する方法

フロントエンド開発において、$ は jQuery の関数です。$ のパラメータが異なると、実装される...

iframe を通じて DOM 要素のサイズ変更を監視する

開発プロセス中によく発生する問題は、div のサイズ変更をどのように監視するかということです。たとえ...

Ubuntu 18.04 LTSでIPアドレスを設定するための完全な手順

序文Ubuntu 18.04 LTS で IP アドレスを設定する方法は、これまで使用されていた設定...

mysqldump を使用した MySql のインポートおよびエクスポート方法の概要

データベースデータをエクスポートします:まずcmdを開いてMySQLのbinフォルダに入ります1. ...

JavaScriptクロージャの原理と機能の詳細な説明

目次導入クロージャの使用カレー作りパブリック変数の実装キャッシュカプセル化(属性のプライベート化)閉...

Linux でのマルチスレッドにおけるフォークの紹介

目次質問:ケース(1)子スレッドを作成する前にフォークするケース(2)子スレッドを作成した後にフォー...

Vue の高度な使用方法チュートリアル 動的コンポーネント

目次基本的な説明AST 解析レンダリング機能通常コンポーネントと動的コンポーネントの比較ファクトリ関...

Mysql テーブルコメントフィールド取得操作

余計なことは言わないで、コードだけ見てみましょう〜 -- テーブル内のフィールドコメントを表示および...

HTML いくつかの特別な分割線効果

1. 基本ライン 2. 特殊効果(効果は独立しておらず、互いに組み合わせることができます) 1. 両...

Docker がポート 2375 を公開し、サーバー攻撃を引き起こす問題と解決策

docker リモート API を学習した学生であれば、ポート 2375 についてよくご存知だと思い...