1,mysql临时表

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来做临时表的清理工作。

本文来源:http://www.jquerycn.cn/a_15609

mysql创建用户临时表_mysql创建与删除临时表实例相关推荐

  1. mysql如何创建用户代码_MySQL创建用户与受权方法_mysql

    注:我的运行环境是widnows xp professional + MySQL5.0 一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY ...

  2. mysql如何创建用户代码_MySQl创建用户和授权的方法介绍(代码示例)

    本篇文章给大家带来的内容是关于MySQl创建用户和授权的方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 权限的管理:如何创建用户和密码 给当前的用户授权 移除当前 ...

  3. mysql创建用户语法_MySQL创建用户

    1.创建用户: 语法: create user 用户1@主机名 identified by '123'|password '' 123:*23AE809DDACAF96AF0FD78ED04B6A26 ...

  4. mysql创建用户表_MySQL 创建用户表和好友表

    人生如果错了方向,停止就是进步 最近想做一个即时通讯的Android demo,但是一直不知道如何处理用户和好友之间的表关系.在网上找了好久也没找到合适的.我本人很少接触数据库,对数据库语句比较差. ...

  5. mysql 远程用户授权_mysql创建远程用户并授权

    今天需要在本地测试系统功能,因为本地没有数据库,就需要在程序里面连接远程数据库: 先用ssh登录远程服务器,用root连上数据库看看情况: mysql> select Host,User,Pas ...

  6. mysql创建用户变量_MySQL创建一个变量的用户?

    您可以为此使用动态查询.首先为用户名设置变量名,为密码设置变量名.语法如下-SET @anyVariableName='yourUserName'; SET @anyVariableName1='yo ...

  7. mysql sql语句临时表_mysql 创建与删除临时表sql语句

    临时表可能是非常有用的,在某些情况下,保持临时数据.最重要的是应该知道的临时表是,他们将当前的客户端会话终止时被删除 当你创建临时表的时候,你可以使用temporary关键字.如: 代码如下 crea ...

  8. mysql 查询 插入 临时表_mysql创建临时表,将查询结果插入已有表中

    今天遇到一个很棘手的问题,想临时存起来一部分数据,然后再读取.我记得学数据库理论课老师说可以创建临时表,不知道mysql有没有这样的功能呢?临时表在内存之中,读取速度应该比视图快一些.然后还需要将查询 ...

  9. 【oracle】创建用户(指定表空间)、删除用户

    创建用户(指定表空间).删除用户 --创建用户(表空间已存在) create user test identified by 123 account unlock default tablespace ...

  10. shell脚本第一篇——自定义创建用户和批量创建用户

    shell脚本第一篇--自定义创建用户和批量创建用户 1.用shell脚本建立Linux用户 # vim /root/user.sh #!/bin/bash #通过脚本自定义创建用户 read -p ...

最新文章

  1. linux_kernel下载网站
  2. 基于双向匹配的陌生人社交策略及算法思考
  3. 【PAT乙级】1036 跟奥巴马一起编程 (15 分)
  4. 精选 GitHub 值得收藏的100个前端项目
  5. django 修改日期
  6. 思科路由器IKEV2 L2L***预共享密码认证最简化配置
  7. ann matlab,人工神经网络ann及其matlab仿真.ppt
  8. iphone主屏幕动态壁纸_iPhone8怎么设置动态壁纸?iPhone8动态壁纸设置教程
  9. Matlab滤波器的verilog实现,FIR滤波器的Verilog实现
  10. 什么是 XDoclet?
  11. Ajax返回值问题思考
  12. django模板层 (标签,过滤器,自定义inclusion_tag,模板的继承与导入)
  13. 51单片机外设篇:按键
  14. 通过MD5校验游戏安装文件完整性实例演示,MD5校验工具Hash使用演示
  15. 基于matlab的圆柱齿轮减速器优化设计,基于MATLAB算法的圆柱齿轮减速器优化设计...
  16. 类编程的WAF(下)
  17. Origin—在曲线的每个峰值处均使用高斯函数进行拟合
  18. 直播最佳推流参数推荐
  19. HDU 5651 xiaoxin juju needs help 组合数
  20. 编程匠艺:编写卓越的代码(第二版

热门文章

  1. [转]微服务概念解析
  2. C++编译原理,O1 O2 O3编译优化
  3. Emule Edonkey server
  4. 完整版JavaWeb环境搭建-maven-servlet...与测试,欢迎大家一起学习
  5. 高并发访问数据库引发的故障
  6. java短信验证码_java实现发送短信验证码
  7. Diligent调查发现,董事会成员是安全和公司治理的关键环节
  8. C++函数参数中的省略号
  9. 无人驾驶刚刚开始的未来
  10. CSS 3之 文本样式(三)