设为首页 加入收藏

TOP

MySQL如何创建和删除临时表(一)
2014-11-24 08:21:48 来源: 作者: 【 】 浏览:0
Tags:MySQL 如何 建和 删除 临时

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退出时。

看看堆栈:

Breakpo

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇用MySQL创建数据库和数据库表简析 下一篇MySQL使用查询结果创建表

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)
·使用华为开发者空间 (2025-12-27 04:19:24)
·Getting Started wit (2025-12-27 03:49:24)
·Ubuntu 上最好用的中 (2025-12-27 03:49:20)