《MYSQL數(shù)據(jù)庫mysql創(chuàng)建與刪除臨時表示例》要點:
本文介紹了MYSQL數(shù)據(jù)庫mysql創(chuàng)建與刪除臨時表示例,希望對您有用。如果有疑問,可以聯(lián)系我們。
1,mysql臨時表
mysql臨時表,屬于session級別,當(dāng)session退出時,臨時表被刪除.臨時表允許與其他表同名,并單獨維護(hù)在thd的結(jié)構(gòu)體中;因此,不同的session可以創(chuàng)建同名的臨時表,并且只操作自己擁有的臨時表;MYSQL應(yīng)用
創(chuàng)建臨時表的語法很簡單:
?MYSQL應(yīng)用
當(dāng)創(chuàng)建臨時表后,會在tmp文件夾下生成兩個文件:
#sql3e95_1a_0.frm
#sql3e95_1a_0.ibd
那么mysql本身究竟是如何創(chuàng)建和刪除臨時表的呢?MYSQL應(yīng)用
2.創(chuàng)建
執(zhí)行sql:
?MYSQL應(yīng)用
1)斷點:ysql_execute_command
mysql_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語句里為false
$2 = 1
create_table_precheck------檢查是否具有創(chuàng)建表的權(quán)限,以及表名在全局鏈表上是否已存在(臨時表無需檢查)
append_file_to_dir???? ------fix names if symlinked tables
if (select_lex->item_list.elements)
-------------------當(dāng)為create ....select這樣的語句時select_lex->item_list.elements為非0值,這里我們只考慮簡單的情況
if ((result= new select_create))
res= handle_select(thd, lex, result, 0);
else
(1)mysql_create_like_table? ---------------create table like...類似的語句
(2)mysql_create_table?? ---------------主要分析這個函數(shù)MYSQL應(yīng)用
2)斷點: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)建臨時表文件名:#sql{進(jìn)程id}_{thread_id}_{當(dāng)前線程的臨時表整數(shù)標(biāo)識thd->tmp_table}?
3978????? rea_create_table --------------------------------------------------------------------創(chuàng)建frm文件和ibd文件
3986????? open_temporary_table-------------------------------------------------------------打開臨時表MYSQL應(yīng)用
1)構(gòu)建table和table_share結(jié)構(gòu)體
2)將table結(jié)構(gòu)體加入到thd->temporary_tables鏈表中
4009????? error= write_create_table_bin_log----------------------------------------------寫入binlogMYSQL應(yīng)用
3.刪除臨時表
手動執(zhí)行 drop table tmp1
?MYSQL應(yīng)用
? drop_temporary_table-----------------------------從thd->temporary_tables上查找臨時表??????????
調(diào)用close_temporary_table來關(guān)閉、刪除臨時表文件,并從thd->temporary_tables上刪除相應(yīng)節(jié)點
if (!drop_temporary)-------------------------------當(dāng)刪除的是非臨時表時,執(zhí)行下面的邏輯MYSQL應(yīng)用
4. 當(dāng)session退出時.
看看堆棧:
?MYSQL應(yīng)用
在session結(jié)束時,會調(diào)用thd::cleanup來做臨時表的清理工作.MYSQL應(yīng)用
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/6491.html