热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL的临时表

为什么突然想说说临时表呢,之前都没有太过多的留意这些知识,是昨天以前的一个同事问了我一句关于临时表的疑问,我也顺便加深写认识。其实,我对于MySQL临时表的应用可以说是一无所知,说


为什么突然想说说临时表呢,之前都没有太过多的留意这些知识,是昨天以前的一个同事问了我一句关于临时表的疑问,我也顺便加深写认识。其实,我对于MySQL临时表的应用可以说是一无所知,说的最多听得最多的也都是,查询语句时用到临时表的情况,就是说的internal temporary table,是MySQL自己因为执行某个操作需要额外使用的,而另一种就是user-defined,用户自己定义的(create temporary table); 之前在798game的时候,公司的手游数据库的设计用到了大量临时表。下面是一些可能在某种意义上,你会觉得很不靠谱的认识,因为这些只是看了一些文字后的皮毛理解。




Internal Temporary Table



当我们的SQL语句相对“复杂”,需要MySQL思考更多时,就会出发自身使用internal temp table,比如:语句中有order by或是group by,还有当我们要修改表的一些属性,比如增加加索引或是添加字段,这些都有可能使用到临时表,我们通过explain这个命令输出的extra列可以看到这样的提示using temporary。这类临时表多数都是内存表也就是MEMORY的存在于内存中,当临时表使用的空间大于tmp_table_size参数设置的值时,该临时表的类型就会自动变成MyISAM的表,那么会被存储到磁盘上,很显然当存取数据从内存转变到磁盘上,这个性能的落差将是我们无法容忍的,所以我们要通过观察Created_tmp_disk_tables参数增长的程度来调整tmp_table_size的到小,该参数仅对于memory类型的internal临时表有效。



User-defined Temporary Table


通过语句CREATE TEMPORARY TABLE XXX 来创建应用所需的临时表。我们自定义的临时表有以下一些特点:


1. 临时表的存在的周期是当前登录的session有效,断开连接将会被立即删除,也可手动将其drop table,无论以任何类型创建的表,在对应的数据库目录下都没有具体的文件生成,但是所有的DML语句都会被记录(后面会说复制的问题);既然是session有效,那么不同的session间是不能访问别人定义的临时表的,不同session定义的临时表名就可以相同。


2. 支持多种类型的表:MYISAM、MEMORY、MERGE、INNODB,其中对于内存表,通过max_heap_table_size参数值来控制表的大小;peter曾经测试基于memory的临时表的查询速度要比mysiam的快10到100倍,还发现key_buffer_size对于查询有相当重要的影响,即便应用所有的表都是innodb类型的,设置该参数对于提高查询性能有很大帮助;


3. 为什么要用它呢?临时表可以将我们之后可能频繁使用到的中间数据集临时保存下来,这样就会提高业务的处理速度,再有就是可以减少程序代码量,将一定的逻辑处理放到数据库上去完成,这之间的代价需要实际去评估;到了5.0以后出现了视图,对于开发人员有多了一种可选择的方法,而视图的定义是可以永久保存到磁盘上的,视图是不能重名的。


4. 对于临时表的DML操作都会被记录到binlog中,但是前提是binlog的日志格式需要设置为statement模式;主从间对于临时表的操作复制,由于从库slave线程的不恰当关闭,将会导致临时表的复制失败,关闭前需要保证所有的临时表都不处在打开更新的状态,这样再次恢复主从是从库对于临时表的复制才能继续正常进行(想不明白???)。



关于临时表的复制,
问题

是:


既然临时表的存在是session级的,那么从库的sql_thread是不可以中断的,但在生产中从库是不可能完全保持正常,当复制的sql线程临时中断,再次恢复以后,之前的临时表也就不存在了,那么之后有依赖于临时表中数据跟新的语句不都会面临找不到该临时表的问题吗?




推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
author-avatar
罗帅飞1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有