MySQL での一時テーブルの使用例

MySQL での一時テーブルの使用例

ここ2日間ちょっと忙しくて、公式アカウントも数日更新が止まってしまいました。その結果、何人かの読者から再度更新してほしいという声が上がりました。まあ、まだ注目してくれている人がいるという証拠です。自分にも他人にもメリットがあり、良いことです。

今日お話ししたいのは、MySQL の一時テーブルについてです。これまで一時テーブルについてはあまり調べたことがありませんでした。MySQL では、特定のシナリオでグループ化やその他の操作を支援するために一時テーブルが使用されるということだけは知っています。今日は一時テーブルについて学びましょう。

1. まず第一に。一時テーブルはセッション レベルにあります。現在のセッションで作成されたテーブルは、他のセッションでは表示されません。

セッション 1:

mysql> 一時テーブル test3 (id_tmp int) を作成します。engine=innodb;
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

セッション2:

mysql> テーブル test3\G の作成を表示します
エラー 1146 (42S02): テーブル 'test.test3' が存在しません

2. セッションでは、一時テーブルの名前は正式テーブルと同じになる場合があります。

mysql> テーブル test2 (id int) を作成します。engine=innodb;
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> 一時テーブル test2 (id_tmp int) を作成します。engine=innodb;
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

同じ名前の test2 テーブルを作成したときにエラーが発生しなかったことがわかります。

3. データベースに物理テーブルと一時テーブルがある場合は、show create table を使用して一時テーブルの内容を表示します。

mysql> テーブル test2\G の作成を表示します
************************** 1. 行 ****************************
    表: test2
テーブルの作成: CREATE TEMPORARY TABLE `test2` (
 `id_tmp` int(11) デフォルト NULL
) エンジン=InnoDB デフォルト文字セット=utf8
セット内の 1 行 (0.00 秒)

4. 一時テーブルが削除された後、show create table は物理テーブルの内容をチェックします。

mysql> "test2"のようなテーブルを表示します。
+------------------------+
| テスト内のテーブル (test2) |
+------------------------+
| テスト2 |
+------------------------+
セット内の 1 行 (0.00 秒)

mysql> テーブル test2 を削除します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> "test2"のようなテーブルを表示します。
+------------------------+
| テスト内のテーブル (test2) |
+------------------------+
| テスト2 |
+------------------------+
セット内の 1 行 (0.00 秒)

5. show tables コマンドでは一時テーブルを表示できません。

6. 異なるセッションで同じ名前の一時テーブルを作成できます。

7. 一時テーブルの保存方法

MySQL では、.frm はテーブル構造を保存するために使用され、.ibd はテーブル データを保存するために使用されます。.frm ファイルは通常、tmpdir パラメータで指定されたディレクトリに配置されます。デスクトップ Windows プラットフォーム上の MySQL は次のとおりです。

mysql> "%tmpdir%"のような変数を表示します。
+-------------------+-------------------------------------------------+
| 変数名 | 値 |
+-------------------+-------------------------------------------------+
| innodb_tmpdir | |
| スレーブロードtmpdir | C:\WINDOWS\SERVIC~1\NETWOR~1\AppData\Local\Temp |
| tmpdir | C:\WINDOWS\SERVIC~1\NETWOR~1\AppData\Local\Temp |
+-------------------+-------------------------------------------------+
セットに 3 行、警告 1 件 (0.01 秒)

MySQL 5.6 では、一時テーブルを保存するために .ibd ファイルが生成されます。

MySQL 5.7 では、一時ファイル データを格納するために一時ファイル テーブルスペースが導入されました。

異なるセッションを使用して同じ名前の一時テーブルを作成すると、一時テーブル ディレクトリに異なる名前の一時テーブル ファイルが存在することがわかります。

これらの一時テーブルは、メモリ内でリンク リストとして表されます。セッションに 2 つの一時テーブルが含まれている場合、MySQL は 2 つの一時テーブルを接続するために一時テーブルのリンク リストを作成します。実際の操作ロジックでは、SQL ステートメントを実行すると、MySQL は一時テーブルのリンク リストをトラバースして、SQL ステートメントで指定されたテーブル名の一時テーブルがあるかどうかを確認します。一時テーブルがある場合は、最初に一時テーブルが操作されます。一時テーブルがない場合は、通常の物理テーブルが操作されます。

8. マスタースレーブレプリケーションにおける一時テーブルに関する注意事項

一時テーブルはセッション レベルにあるため、セッションが終了すると削除されます。ただし、マスター ノードは一時テーブルを表示せず、セッションを閉じて削除します。では、スレーブ ノードは一時テーブルをいつ削除するかをどのようにして知るのでしょうか。

マスターノードが次の SQL を実行すると仮定します。

クレタテーブルtbl;
tbl のような一時テーブル tmp を作成します。
tmp値(0,0)に挿入します。
tbl に挿入します。tmp から * を選択します。

binlog=statement/mixed モードでは、一時テーブル関連の操作の binlog が記録されない場合、最後の挿入ステートメントでエラーが報告されます。 tmp テーブルが見つからないためです。この場合、MySQL の binlog は一時テーブルに対する操作を記録します。マスター データベースのセッションが閉じられると、マスター スレーブ データの一貫性を確保するために、一時テーブルを削除する SQL ステートメントが binlog に自動的に追加されます。

binlog=row モードでは、データのすべてのフィールドが binlog で見つかるため、一時テーブルに関連する SQL ステートメントは binlog に記録されません。最後の insert into select ステートメントの場合、binlog は (0,0) を tbl テーブルに挿入するレコードを記録します。

binlog=row モードでは、マスター データベースが drop table tmp コマンドを使用して一時テーブルを削除すると、binlog は一時テーブルに関連する操作を記録しないため、このレコードは無視されます。

9. 異なるスレッドからの同じ名前の一時テーブルがスレーブ データベースに同時に存在できるのはなぜですか?

一時テーブルはセッション レベルにあり、異なるセッション間の一時テーブルに同じ名前を付けることができることはわかっています。スレーブ ライブラリが binlog を再生するとき、スレーブ ライブラリは、同じ名前のこれらの一時テーブルがどのトランザクションに属しているかをどのように認識するのでしょうか。

この概念を理解するには、関数内の仮パラメータと実パラメータの概念を参照できます。仮パラメータと実パラメータは同じ名前を持つことができますが、割り当てられると、それらのポインタ値は異なります。したがって、同じ名前のパラメータの場合、ポインタ値が異なるため、コンパイラではエラーは発生しません。

MySQL はデータ テーブルを管理します。物理ファイルに加えて、メモリ内に異なるテーブルを区別するメカニズムもあります。各テーブルは table_def_key に対応します。 table_def_keyの値は「ライブラリ名+テーブル名+server_id+thread_id」で構成されます。thread_idが異なるため、ライブラリから操作しても競合は発生しません。

以上がMySQLのメモリ一時テーブルについての詳しい説明です。MySQLのメモリ一時テーブルについてさらに詳しく知りたい方は、123WORDPRESS.COMの他の関連記事もぜひご覧ください!

以下もご興味があるかもしれません:
  • MySQL メモリテーブルの基本学習チュートリアル
  • MySQLでメモリテーブルを作成する方法
  • カーソル ループを使用して、MySQL ストアド プロシージャで一時テーブルを読み取る
  • Mysql の一時テーブルとパーティションテーブルの違いの詳細な説明
  • Mysql一時テーブルの原理と作成方法の分析
  • MySQL メモリテーブルと一時テーブルの使用方法の詳細な説明

<<:  Docker を使用した ELK7.3.0 ログ収集サービスの導入に関するベスト プラクティス

>>:  vuex名前空間の使用

推薦する

Linux で文字化けしたファイルや特殊文字のファイルを削除する方法

エンコーディングの理由により、Linux サーバーに中国語のファイルやディレクトリをアップロードまた...

CSS設定div背景画像実装コード

コンポーネントに背景画像コントロールを追加するには、次の 2 つの手順だけが必要です。 <表示...

MySQL クイックデータ比較テクニック

MySQL の運用と保守において、R&D の同僚が 2 つの異なるインスタンスのデータを比較...

Win10 での MySQL 5.7 の詳細なインストールと設定のチュートリアル

1. MySQL 5.7を解凍する2. 新しい設定ファイルmy.iniを作成し、 D:\Free\m...

Linux プロセスが占有するポート番号を表示する 6 つの方法

Linux システム管理者にとって、サービスがポートに正しくバインドされているか、またはポートをリッ...

突然外部ネットワークからDockerにアクセスできなくなる問題の解決方法

マスターのメソッドによると、原因は sysctl net.ipv4.ip_forward であること...

jQueryはショッピングカート機能を実装します

この記事の例では、ショッピングカート機能を実装するためのjQueryの具体的なコードを参考までに共有...

HTML におけるいくつかの特殊属性タグの使用法の紹介

以下の属性はブラウザとの互換性があまりありません。 1.transform:rotate(45度) ...

JavaScript 関数呼び出しの典型的なサンプルコード

目次JavaScript 関数呼び出しの典型的な例JS関数の定義と呼び出し方法要約するJavaScr...

花火効果を実現するJavaScript(オブジェクト指向)

この記事では、花火効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します。具...

Vue で Alibaba のアイコンフォント ベクター アイコンを使用する方法について

インターネット上には多くのインポート方法があり、公式も3つのインポート方法を提供していますが、インポ...

Centos8 で Apache httpd2.4.37 を使用して Web サーバーをインストールする詳細な手順

ステップ 1: yum install httpd -y #httpd サービスをインストールします...

収集する価値のある Linux ドキュメント編集コマンド 27 個

Linux col コマンドLinux の col コマンドは制御文字をフィルタリングするために使用...

nginx ロケーション優先度の詳細な説明

場所表現タイプ~ は大文字と小文字を区別して通常の一致を実行することを示します~*は大文字と小文字を...

複数の無関係なテーブルからデータをクエリし、MySQL でページングする方法

MySQL 複数の無関係なテーブルクエリデータとページング機能要件主キーと外部キーの関連付けがない ...