mysql怎么删除临时表里的数据_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
_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来做临时表的清理工作
摘自 记录成长之路
mysql怎么删除临时表里的数据_MySQL如何创建和删除临时表 | 学步园相关推荐
- mysql怎么删除临时表里的数据_谈谈MySQL数据库中临时表的应用
MySQL在很多情况下都会用到临时表总结一下什么时候会用到临时表 什么是临时表MySQL用于存储一些中间结果集的表临时表只在当前连接可见当关闭连接时Mysql会自动删除表并释放所有空间. 以下讨论的是 ...
- mysql 大量数据 更改索引_一文看懂ICP原理--MySQL用索引去表里取数据的一种优化...
概述 今天主要介绍一下mysql的ICP特性,可能很多人都没听过,这里用一个实验来帮助大家加深一下理解. 一.Index_Condition_Pushdown Index Condition Push ...
- MySQL讲义第 55 讲——用户权限管理之创建和删除用户
MySQL讲义第 55 讲--用户权限管理之创建和删除用户 文章目录 MySQL讲义第 55 讲--用户权限管理之创建和删除用户 一.创建用户 1.使用 create user 命令创建用户 2.使用 ...
- mysql提供什么语句用于删除表中的数据_MySQL提供【 】语句用于删除表中的数据...
MySQL提供[ ]语句用于删除表中的数据 答:暂无解析 出头教育: 当双活塞杆液压缸的缸体固定, 活塞杆与运动件固连时,其运动件的运动范 围等于液压缸有效行程的 答:三倍 可同时搜集若干调查单位资料 ...
- mysql删除表中所有数据_MySQL删除或清空表中数据的方法
原标题:MySQL删除或清空表中数据的方法 要想把MySQL中的数据删除或清空,可以通过两种方法来实现:DELETE语句和TRUNCATE TABLE语句. DELETE语句可以将表中所有记录都删除, ...
- mysql 删除字段数据_MySQL教程37-MySQL修改/删除字段
这里主要介绍 MySQL 修改和删除数据表字段的方法. 修改字段名称 MySQL 中修改表字段名的语法规则如下: ALTER TABLE CHANGE : 其中: 旧字段名:指修改前的字段名: 新字段 ...
- mysql 删除不了数据_MySQL不建议delete删除数据
InnoDB存储架构 从这张图可以看到,InnoDB存储结构主要包括两部分:逻辑存储结构和物理存储结构. 逻辑上是由表空间tablespace -> 段segment或者inode -> ...
- mysql删除多表视图数据,【杂谈】怎样删除mysql数据表视图中数据
本篇文章主要给人人引见 mysql数据表中视图数据的删除操纵. 经由之前关于mysql视图的相干学问引见,置信列位新手朋侪们对视图的定义及基础操纵都有更进一步的熟悉. 简朴的说,视图就是一些查询语句的 ...
- MySQL之数据表(数据库的创建与删除、数据表的创建与删除)
MySQL之数据表 创建数据库 删除数据库 认识数据表 创建数据表 删除数据表 创建数据库 在创建表之前,一定要先创建用来存储表的数据库.数据库中包含数据表.视图.索引.查询.规则.默认值等数据库 ...
- mysql 异常关机后 无法查数据_MySQL数据库非法关机造成数据表损坏怎么排查 | 学步园...
该篇文章我们介绍由于非法硬件关机,造成了MySQL数据库的数据表损坏,数据库不能正常运行的一个实例.下面学步园小编来讲解下MySQL数据库非法关机造成数据表损坏怎么排查? MySQL数据库非法关机造成 ...
最新文章
- 深度学习与TensorFlow
- SQL -- 是否或推断线相交以在其内部的平面
- 《流畅的python》学习日志----装饰器工厂函数
- 图像信噪比计算公式_CT 科研设计之图像质量对比研究三步曲
- LeetCode 1848. 到目标元素的最小距离
- Java基础学习总结(63)——Java集合总结
- Mysql Workbench详细使用教程
- 《Act with Prudence》读后感
- Server-U文件名中文乱码问题解决方法
- linux ip被占用顶掉,记一次 Linux服务器被***后的排查思路
- vue中点击高德地图获取经纬度
- UE5导入MetaHuman虚拟头像后,连接live link face,面部表情捕捉出错修正
- 上传图片计算机没有桌面,电脑桌面消失了!
- 圣剑传说 玛娜传奇(Legend of Mana)(LOM)全防具取得方法
- linux拷贝文件前几行,Linux显示文件前几行、拷贝文件前几行、删除文件前几列...
- HaaS轻应用(Python)总览
- saturn 源码解析
- 恭喜ISO9001质量管理体系成功
- 用c语言编写篮球过程运行结果,基于单片机的篮球计时计分器设计(c语言编程、含proteus仿真图) 本科毕业论文.doc...
- 计算机设备管理器该文件没有与之,该文件没有与之关联的程序怎么办?电脑管理/视频/exe文件没有与之相关如何解决?...
热门文章
- C语言的getc()和putc()函数
- 电驴服务器更新的作用,[转载]【强烈推荐更新】最新电驴服务器列表(2013.7.11)...
- BT服务器的搭建(tracker-P2P服务器架设)(转)
- js自动生成手机扫描二维码就可以实现自动下载apk的二维码
- 从零构建 React 开发环境(一) —— hello world,麻雀虽小五脏俱全~
- 深度相机:结构光、TOF、双目相机
- idou老师教你学Istio11 : 如何用Istio实现流量熔断
- 什么是爬虫?有哪些用途
- 7-11 How Long Does It Take(25 分)
- vmware 运行xp 蓝屏