您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)MySQL中怎么創(chuàng)建和刪除臨時(shí)表,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
1.介紹:
MySQL臨時(shí)表,屬于session級(jí)別,當(dāng)session退出時(shí),臨時(shí)表被刪除。臨時(shí)表允許與其他表同名,并單獨(dú)維護(hù)在thd的結(jié)構(gòu)體中;因此,不同的session可以創(chuàng)建同名的臨時(shí)表,并且只操作自己擁有的臨時(shí)表;
創(chuàng)建臨時(shí)表的語(yǔ)法很簡(jiǎn)單:
root@test 03:26:44>show create table tmp1\G
*************************** 1. row ***************************
Table: tmp1
Create Table: CREATE TEMPORARY TABLE `tmp1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
當(dāng)創(chuàng)建臨時(shí)表后,會(huì)在tmp文件夾下生成兩個(gè)文件:
#sql3e95_1a_0.frm
#sql3e95_1a_0.ibd
那么MySQL本身究竟是如何創(chuàng)建和刪除臨時(shí)表的呢?
2.創(chuàng)建
執(zhí)行SQL:
CREATE TEMPORARY TABLE `tmp1` ( `a` int(11) NOT NULL AUTO_INCREMENT, `b` int(11) DEFAULT NULL, `c` int(11) DEFAULT NULL, PRIMARY KEY (`a`) );
1)斷點(diǎn):ysql_execute_command
_execute_command:
2205 switch (lex->sql_command) {
(gdb)
2532 if (!(lex->create_info.options & HA_LEX_CREATE_TMP_TABLE))
(gdb) p lex->create_info.options --------if語(yǔ)句里為false
$2 = 1
create_table_precheck------檢查是否具有創(chuàng)建表的權(quán)限,以及表名在全局鏈表上是否已存在(臨時(shí)表無(wú)需檢查)
append_file_to_dir ------Fix names if symlinked tables
if (select_lex->item_list.elements) -------------------當(dāng)為create ....select這樣的語(yǔ)句時(shí)select_lex->item_list.elements為非0值,這里我們只考慮簡(jiǎn)單的情況
if ((result= new select_create))
res= handle_select(thd, lex, result, 0);
else
(1)mysql_create_like_table ---------------create table like...類似的語(yǔ)句
(2)mysql_create_table ---------------主要分析這個(gè)函數(shù)
2)斷點(diǎn):mysql_create_table
mysql_create_table
mysql_create_table_no_lock
check_engine
file = get_new_handler
3842 set_table_default_charset(thd, create_info, (char*) db);
3844 if (mysql_prepare_create_table(thd, create_info, alter_info,
3854 path_length= build_tmptable_filename(thd, path, sizeof(path)); -----創(chuàng)建臨時(shí)表文件名:#sql{進(jìn)程id}_{thread_id}_{當(dāng)前線程的臨時(shí)表整數(shù)標(biāo)識(shí)thd->tmp_table}
3978 rea_create_table --------------------------------------------------------------------創(chuàng)建frm文件和ibd文件
3986 open_temporary_table-------------------------------------------------------------打開臨時(shí)表
(1)構(gòu)建table和table_share結(jié)構(gòu)體
(2)將table結(jié)構(gòu)體加入到thd->temporary_tables鏈表中
4009 error= write_create_table_bin_log----------------------------------------------寫入binlog
3.刪除臨時(shí)表
手動(dòng)執(zhí)行 drop table tmp1
mysql_execute_command
case SQLCOM_DROP_TABLE:
mysql_rm_table
mysql_rm_table_part2
for (table= tables; table; table= table->next_local)
drop_temporary_table-----------------------------從thd->temporary_tables上查找臨時(shí)表
調(diào)用close_temporary_table來(lái)關(guān)閉、刪除臨時(shí)表文件,并從thd->temporary_tables上刪除相應(yīng)節(jié)點(diǎn)
if (!drop_temporary)-------------------------------當(dāng)刪除的是非臨時(shí)表時(shí),執(zhí)行下面的邏輯
----------------------------------------
4. 當(dāng)session退出時(shí)。
看看堆棧:
Breakpoint 16, rm_temporary_table (base=0xc8c560, path=0x1427c10 "/u01/mysql-5148.stock/tmp/#sql3e95_1d_0") at sql_base.cc:5634
5634 bool rm_temporary_table(handlerton *base, char *path)
(gdb)
5641 strmov(ext= strend(path), reg_ext);
(gdb) bt
#0 rm_temporary_table (base=0xc8c560, path=0x1427c10 "/u01/mysql-5148.stock/tmp/#sql3e95_1d_0") at sql_base.cc:5641
#1 0x00000000005f6eaa in close_temporary (table=0x1427030, free_share=true, delete_table=true) at sql_base.cc:1928
#2 0x00000000005f725f in close_temporary_tables (thd=0x14065f0) at sql_base.cc:1549
#3 0x0000000000592d9b in THD::cleanup (this=0x14065f0) at sql_class.cc:967
#4 0x00000000005a3579 in unlink_thd (thd=0xc8c560) at mysqld.cc:1858
#5 0x00000000005a35dc in one_thread_per_connection_end (thd=0xc8c560, put_in_cache=16) at mysqld.cc:1945
#6 0x00000000005ac208 in handle_one_connection (arg=0x14065f0) at sql_connect.cc:1141
#7 0x0000003e638064a7 in start_thread () from /lib64/libpthread.so.0
#8 0x0000003e630d3c2d in clone () from /lib64/libc.so.6
#9 0x0000000000000000 in ?? ()
在session結(jié)束的時(shí)候,會(huì)調(diào)用THD::cleanup來(lái)做臨時(shí)表的清理工作
關(guān)于MySQL中怎么創(chuàng)建和刪除臨時(shí)表就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。