• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    MySQL如何創建和刪除臨時表_MySQL

    來源:懂視網 責編:小采 時間:2020-11-09 18:11:10
    文檔

    MySQL如何創建和刪除臨時表_MySQL

    MySQL如何創建和刪除臨時表_MySQL:bitsCN.com 1.介紹: MySQL臨時表,屬于session級別,當session退出時,臨時表被刪除。臨時表允許與其他表同名,并單獨維護在thd的結構體中;因此,不同的session可以創建同名的臨時表,并且只操作自己擁有的臨時表; 創建臨時表的語法很簡單: r
    推薦度:
    導讀MySQL如何創建和刪除臨時表_MySQL:bitsCN.com 1.介紹: MySQL臨時表,屬于session級別,當session退出時,臨時表被刪除。臨時表允許與其他表同名,并單獨維護在thd的結構體中;因此,不同的session可以創建同名的臨時表,并且只操作自己擁有的臨時表; 創建臨時表的語法很簡單: r

    bitsCN.com

    1.介紹:

    MySQL臨時表,屬于session級別,當session退出時,臨時表被刪除。臨時表允許與其他表同名,并單獨維護在thd的結構體中;因此,不同的session可以創建同名的臨時表,并且只操作自己擁有的臨時表;

    創建臨時表的語法很簡單:

    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)

    當創建臨時表后,會在tmp文件夾下生成兩個文件:

    #sql3e95_1a_0.frm

    #sql3e95_1a_0.ibd

    那么MySQL本身究竟是如何創建和刪除臨時表的呢?

    2.創建

    執行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)斷點: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 ---------------主要分析這個函數

    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-------------------------------------------------------------打開臨時表

    (1)構建table和table_share結構體

    (2)將table結構體加入到thd->temporary_tables鏈表中

    4009 error= write_create_table_bin_log----------------------------------------------寫入binlog

    3.刪除臨時表

    手動執行 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上查找臨時表

    調用close_temporary_table來關閉、刪除臨時表文件,并從thd->temporary_tables上刪除相應節點

    if (!drop_temporary)-------------------------------當刪除的是非臨時表時,執行下面的邏輯

    ----------------------------------------

    4. 當session退出時。

    看看堆棧:

    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結束的時候,會調用THD::cleanup來做臨時表的清理工作

    摘自 記錄成長之路

    bitsCN.com

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    MySQL如何創建和刪除臨時表_MySQL

    MySQL如何創建和刪除臨時表_MySQL:bitsCN.com 1.介紹: MySQL臨時表,屬于session級別,當session退出時,臨時表被刪除。臨時表允許與其他表同名,并單獨維護在thd的結構體中;因此,不同的session可以創建同名的臨時表,并且只操作自己擁有的臨時表; 創建臨時表的語法很簡單: r
    推薦度:
    標簽: 創建 如何 mysql
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 亚洲精品国产品国语在线| 国产精品毛片VA一区二区三区| 伊人 久久 精品 | 久久精品国产亚洲av麻豆小说| 国产精品99无码一区二区| 一本精品中文字幕在线| 免费人妻精品一区二区三区| 成人午夜精品亚洲日韩| 国产精品高清视亚洲精品| 久久亚洲日韩精品一区二区三区| 欧美日韩国产精品系列| 国产午夜精品理论片免费观看| 国产精品久久久久久搜索| 久久Av无码精品人妻系列| 人妻少妇精品久久| 精品无码久久久久久久动漫| 国产精品电影在线| 亚洲精品欧美综合在线| 国产成人精品日本亚洲11 | 国产啪亚洲国产精品无码| 91精品国产色综久久| 久久99精品久久久久久| 55夜色66夜色国产精品视频| 久久精品国产亚洲AV香蕉| 亚洲AV第一页国产精品| 中日精品无码一本二本三本| 日本精品久久久久久久久免费| 久久狠狠一本精品综合网| 精品久久久久久无码人妻蜜桃| 精品乱子伦一区二区三区| 精品日韩在线视频一区二区三区| 国产小呦泬泬99精品| 精品国产一区二区三区在线观看 | 欧美精品欧美人与动人物牲交 | 精品无码久久久久久久久久| 国产亚洲精品看片在线观看| 国产亚洲精品无码拍拍拍色欲| 久久国产成人精品国产成人亚洲| 久久精品国产亚洲7777| 人妻少妇看A偷人无码精品| 亚洲精品成人a在线观看|