MySQL如何创建和删除临时表_MySQL
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
热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Golang中结构体强转是将一种结构体类型的值转换为另一种类型。可以通过断言强转、反射强转、指针间接强转等技巧实现。断言强转使用类型断言,反射强转使用反射机制,指针间接强转避免值复制。具体步骤为:1.断言强转:使用typeassertion语法;2.反射强转:使用reflect.Type.AssignableTo和reflect.Value.Convert函数;3.指针间接强转:使用指针解引用。

使用json.Marshal函数将结构体转换为JSON字符串在Go语言中,可以使用json.Marshal函数将结构体转换为JSON字符串。结构体是一种由多个字段组成的数据类型,而JSON是一种常用的轻量级数据交换格式。将结构体转换为JSON字符串可以方便地在不同系统之间交换数据。下面是一个示例代码:packagemainimport(&q

在C中,结构体和数组都用作数据类型的容器,即在结构体和数组中我们都可以存储数据,也可以对它们执行不同的操作。基于内部实现,以下是两者之间存在一些基本差异。Sr.编号键结构数组1定义结构体可以定义为一种数据结构,用作容器,可以容纳不同类型的变量。另一方面,数组是一种用作容器的数据结构,可以容纳相同类型的变量,但不支持多种数据类型变量。2内存分配输入数据的内存分配结构不必位于连续的内存位置。而在数组的情况下,输入数据存储在连续的内存分配中,这意味着数组将数据存储在分配连续内存块的内存模型中(即,具有

这里我们来看看什么是C语言中的匿名联合体和结构体。匿名联合体和结构体就是未命名的联合体和结构体。由于它们没有名称,因此我们无法创建它的直接对象。我们将其用作嵌套结构或联合。这些是匿名联合和结构的示例。struct{ datatypevariable; ...};union{ datatypevariable; ...};在这个例子中,我们正在创建

结构体在PHP中的应用和操作方法随着PHP语言的不断发展壮大,其功能也日益完善。除了常见的变量和数组,PHP还提供了一种更为灵活的数据类型,即结构体(Struct)。结构体是一种由多个不同类型的数据成员组成的复合数据类型。它可以将相关数据进行组合,形成一个更为完整和有结构的数据。在PHP中,可以通过使用类和对象来模拟结构体的行为和功能。首先,我们来看一下如何

使用json.Unmarshal函数将JSON字符串解析为结构体在Go语言中,可以使用json.Unmarshal函数将JSON字符串解析为结构体。这是一个非常有用的功能,特别是在处理API响应或读取配置文件时。首先,我们需要定义一个结构体类型,来表示我们要解析的JSON对象的结构。假设我们有如下的JSON字符串:{"name"

sizeof()获取的结构类型元素的大小并不总是等于每个单独成员的大小。有时编译器会添加一些填充以避免对齐问题。所以尺寸可能会改变。当结构成员后面跟着一个尺寸较大的成员或位于结构末尾时,将添加填充。不同的编译器有不同类型的对齐约束。在C标准中,总对齐结构取决于实现。情况1在这种情况下,双精度z为8字节长,大于x(4字节))。因此又添加了4个字节的填充。此外,短类型数据y在内存中具有2字节空间,因此添加了额外的6字节作为填充。示例代码#include<stdio.h>structmyS

如何在Golang中返回结构体?在函数签名中指定结构体类型,如:funcgetPerson()Person{}。在函数体内使用return{}语句返回结构体,其中包含所需字段。结构体字段可以是基础类型或其他结构体。
