欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中臨時表的使用示例

 更新時間:2020年11月09日 14:19:21   作者:AsiaYe  
這篇文章主要介紹了MySQL中的內(nèi)存臨時表的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下

    這兩天事情稍微有點多,公眾號也停止更新了幾天,結(jié)果有讀者催更了,也是,說明還是有人關(guān)注,利己及人,挺好。

    今天分享的內(nèi)容是MySQL中的臨時表,對于臨時表,之前我其實沒有過多的研究,只是知道MySQL在某些特定場景下會使用臨時表來輔助進行g(shù)roup by等一些列操作,今天就來認識下臨時表吧。

1、首先。臨時表是session級別的,當前session創(chuàng)建的表,在其他session中看不到。

session 1:

mysql> create temporary table test3 (id_tmp int)engine=innodb;
Query OK, 0 rows affected (0.00 sec)

session 2:

mysql> show create table test3\G
ERROR 1146 (42S02): Table 'test.test3' doesn't exist

2、臨時表在session中,可以和正式的表重名。

mysql> create table test2 (id int)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> create temporary table test2 (id_tmp int)engine=innodb;
Query OK, 0 rows affected (0.00 sec)

   可以看到,創(chuàng)建同名的test2表的時候,并沒有出現(xiàn)報錯的情況。

3、當數(shù)據(jù)庫中物理表和臨時表的時候,使用show create table查看的是臨時表的內(nèi)容:

mysql> show create table test2\G
*************************** 1. row ***************************
    Table: test2
Create Table: CREATE TEMPORARY TABLE `test2` (
 `id_tmp` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

4、臨時表drop掉之后,show create table查看的是物理表的內(nèi)容。

mysql> show tables like "test2";
+------------------------+
| Tables_in_test (test2) |
+------------------------+
| test2         |
+------------------------+
1 row in set (0.00 sec)

mysql> drop table test2;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables like "test2";
+------------------------+
| Tables_in_test (test2) |
+------------------------+
| test2         |
+------------------------+
1 row in set (0.00 sec)

5、show tables命令,不能看到臨時表。

6、不同的session中可以創(chuàng)建同名的臨時表。

7、臨時表保存方法

   在MySQL中,使用.frm來保存表結(jié)構(gòu),而使用.ibd來保存表數(shù)據(jù),.frm文件一般是放在tmpdir這個參數(shù)指定的目錄下面的。臺式機windows平臺下MySQL的如下:

mysql> show variables like "%tmpdir%";
+-------------------+-------------------------------------------------+
| Variable_name   | Value                      |
+-------------------+-------------------------------------------------+
| innodb_tmpdir   |                         |
| slave_load_tmpdir | C:\WINDOWS\SERVIC~1\NETWOR~1\AppData\Local\Temp |
| tmpdir      | C:\WINDOWS\SERVIC~1\NETWOR~1\AppData\Local\Temp |
+-------------------+-------------------------------------------------+
3 rows in set, 1 warning (0.01 sec)

MySQL5.6版本下,會生成一個.ibd的文件來保存臨時表。

MySQL5.7版本下,引入了臨時文件表空間,專門用來存放臨時文件的數(shù)據(jù)。

當我們使用不同的session來創(chuàng)建相同名稱的臨時表的時候,會發(fā)現(xiàn)臨時表的目錄下面存在不同名稱的臨時表文件:

這些臨時表在內(nèi)存中是通過鏈表的方式來表示的,如果一個session中包含兩個臨時表,MySQL會創(chuàng)建一個臨時表的鏈表,將這兩個臨時表連接起來,實際的操作邏輯中,如果我們執(zhí)行了一條SQL,MySQL會遍歷這個臨時表的鏈表,檢查是否有這個SQL中指定表名字的臨時表,如果有臨時表,優(yōu)先操作臨時表,如果沒有臨時表,則操作普通的物理表。

8、臨時表在主從復(fù)制中的注意點

   臨時表由于是session級別的,那么在session退出的時候,是會刪除臨時表的。但是主節(jié)點中并沒有對臨時表進行顯示的操作,而是關(guān)閉session即可刪除,那么從節(jié)點如何知道什么時候才能刪除臨時表呢?

假設(shè)主節(jié)點進行如下SQL:

crete table tbl;
create temporary table tmp like tbl;
insert into tmp values (0,0);
insert into tbl select * from tmp;

  在binlog=statement/mixed模式下,如果不記錄臨時表相關(guān)操作的binlog,則最后一條insert語句會報錯。因為找不到tmp這個表。這種情況下,MySQL的binlog中會記錄臨時表的操作,當主庫的session關(guān)閉的時候,自動的在binlog中添加drop temporary table的SQL語句,從而保證主從數(shù)據(jù)的一致。

   在binlog=row模式下,跟臨時表有關(guān)的SQL,都不會記錄到binlog里面,因為row模式下,數(shù)據(jù)的每個字段在binlog中都能找到,針對最后一個insert into select語句,binlog中會記錄成往tbl表中插入(0,0)這條記錄。

    binlog=row模式下,當主庫上主動使用drop table tmp的命令來刪除臨時表的時候,此時因為binlog中不記錄臨時表的相關(guān)操作,所以這條記錄也會被忽略。

9、不同線程的同名臨時表在從庫上如何同時存在?

   我們知道臨時表是session級別的,而且不同session之間的臨時表可以重名,在從庫進行binlog回放的時候,從庫是如何知道這些重名的臨時表分別屬于哪個事務(wù)的呢?

 這個概念的理解可以參考函數(shù)中的形參和實參的概念,形參和實參可能有同樣的名字,進行賦值的時候,二者的指針值是不一樣的,所以同名的參數(shù),對編譯器來講,由于指針值不一樣,所以不會出現(xiàn)錯誤。

   MySQL維護數(shù)據(jù)表,除了物理上要有文件外,內(nèi)存里面也有一套機制區(qū)別不同的表,每個表都對應(yīng)一個table_def_key。而這個table_def_key的值是由"庫名字+表名字+server_id+thread_id"組成的,因為thread_id不同,所以在從庫中進行操作的時候,是不會沖突的。

以上就是詳解MySQL中的內(nèi)存臨時表的詳細內(nèi)容,更多關(guān)于MySQL 內(nèi)存臨時表的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決Mysql多行子查詢的使用及空值問題

    解決Mysql多行子查詢的使用及空值問題

    所謂多行子查詢,是指執(zhí)行查詢語句獲得的結(jié)果集中返回了多行數(shù)據(jù)的子查詢,今天通過本文給大家分享Mysql多行子查詢的使用及空值問題,感興趣的朋友一起看看吧
    2022-01-01
  • MySQL sleep函數(shù)使用方法詳解

    MySQL sleep函數(shù)使用方法詳解

    sleep函數(shù)時「延時」指定時間(單位秒),也就是讓程序停止執(zhí)行一段指定的時間,本文就給大家簡單的介紹一下MySQL sleep函數(shù)使用方法,需要的朋友可以參考下
    2023-07-07
  • Mysql服務(wù)器的啟動與停止(一)

    Mysql服務(wù)器的啟動與停止(一)

    Mysql服務(wù)器的啟動與停止(一)...
    2006-11-11
  • win7下mysql6.x出現(xiàn)中文亂碼的完美解決方法

    win7下mysql6.x出現(xiàn)中文亂碼的完美解決方法

    本文給大家分享win7下mysql 6.x出現(xiàn)中文亂碼的完美解決方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-04-04
  • MySQL 原理與優(yōu)化之Update 優(yōu)化

    MySQL 原理與優(yōu)化之Update 優(yōu)化

    這篇文章主要介紹了MySQL 原理與優(yōu)化之Update 優(yōu)化,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-08-08
  • MySQL必備基礎(chǔ)之分組函數(shù) 聚合函數(shù) 分組查詢詳解

    MySQL必備基礎(chǔ)之分組函數(shù) 聚合函數(shù) 分組查詢詳解

    這篇文章主要介紹了MySQL分組函數(shù)、聚合函數(shù)、分組查詢,結(jié)合實例形式分析了MySQL查詢分組函數(shù)以及查詢聚合函數(shù)相關(guān)使用技巧,需要的朋友可以參考下
    2021-10-10
  • 聊聊MySQL事務(wù)的特性和隔離級別

    聊聊MySQL事務(wù)的特性和隔離級別

    這篇文章主要介紹了MySQL事務(wù)的特性和隔離級別的相關(guān)資料,幫助大家粗略的認識下MySQL 事務(wù)的相關(guān)知識,感興趣的朋友可以了解下
    2020-09-09
  • SQL語句多表聯(lián)查的實現(xiàn)方法示例

    SQL語句多表聯(lián)查的實現(xiàn)方法示例

    多表聯(lián)合檢索可以通過連接運算來完成,而連接運算又可以通過廣義笛卡爾積后再進,下面這篇文章主要給大家介紹了關(guān)于SQL語句多表聯(lián)查實現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • MySQL中INSERT INTO的具體使用

    MySQL中INSERT INTO的具體使用

    INSERT INTO 是 MySQL 數(shù)據(jù)庫中非常重要的一種 SQL 命令,用于將新行插入到表中,本文主要介紹了MySQL中INSERT INTO的具體使用,感興趣的可以了解一下
    2024-03-03
  • MySQL/MariaDB的Root密碼重置教程

    MySQL/MariaDB的Root密碼重置教程

    這篇文章主要給大家介紹了關(guān)于MySQL/MariaDB的Root密碼重置的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09

最新評論