《MYSQL數據庫mysql創建與刪除臨時表示例》要點:
本文介紹了MYSQL數據庫mysql創建與刪除臨時表示例,希望對您有用。如果有疑問,可以聯系我們。
1,mysql臨時表
mysql臨時表,屬于session級別,當session退出時,臨時表被刪除.臨時表允許與其他表同名,并單獨維護在thd的結構體中;因此,不同的session可以創建同名的臨時表,并且只操作自己擁有的臨時表;MYSQL應用
創建臨時表的語法很簡單:
?MYSQL應用
當創建臨時表后,會在tmp文件夾下生成兩個文件:
#sql3e95_1a_0.frm
#sql3e95_1a_0.ibd
那么mysql本身究竟是如何創建和刪除臨時表的呢?MYSQL應用
2.創建
執行sql:
?MYSQL應用
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------檢查是否具有創建表的權限,以及表名在全局鏈表上是否已存在(臨時表無需檢查)
append_file_to_dir???? ------fix names if symlinked tables
if (select_lex->item_list.elements)
-------------------當為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?? ---------------主要分析這個函數MYSQL應用
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)); -----創建臨時表文件名:#sql{進程id}_{thread_id}_{當前線程的臨時表整數標識thd->tmp_table}?
3978????? rea_create_table --------------------------------------------------------------------創建frm文件和ibd文件
3986????? open_temporary_table-------------------------------------------------------------打開臨時表MYSQL應用
1)構建table和table_share結構體
2)將table結構體加入到thd->temporary_tables鏈表中
4009????? error= write_create_table_bin_log----------------------------------------------寫入binlogMYSQL應用
3.刪除臨時表
手動執行 drop table tmp1
?MYSQL應用
? drop_temporary_table-----------------------------從thd->temporary_tables上查找臨時表??????????
調用close_temporary_table來關閉、刪除臨時表文件,并從thd->temporary_tables上刪除相應節點
if (!drop_temporary)-------------------------------當刪除的是非臨時表時,執行下面的邏輯MYSQL應用
4. 當session退出時.
看看堆棧:
?MYSQL應用
在session結束時,會調用thd::cleanup來做臨時表的清理工作.MYSQL應用
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/6491.html