zoukankan      html  css  js  c++  java
  • MySQL 临时表

    MySQL 临时表

    MySQL提供临时表功能,在保存一些临时数据是非常有用的。临时表只在当前连接可见,当连接关闭时,MySQL会自动删除表并释放空间。当然也可以手动删除临时表

    MySQL数据库的临时表分两种:内部临时表和外部临时表。

    外部临时表

    外部临时表指的是通过 CREATE TEMPORARY TABLE 语法显示创建的临时表。这种临时表只对当前会话可见,其他会话是看不到这个临时表的。当前会话关闭时,临时表会自动删除。外部临时表可以与非临时表同名,当创建的临时表与非临时表同名时,非临时表对当前会话不可见,知道临时表被删除。

    内部临时表

    内部临时表是一种特殊轻量级的临时表,主要用来性能优化。这种临时表是由MySQL自动创建并管理,用来存储并操作某些中间结果,这种操作可能包括在优化阶段和执行阶段。这种内部临时表对用户是不可见的,但是可以通过执行计划EXPLAIN 或 SHOW STATUS可以查看MySQL是否使用内部临时表来帮助完成某个操作。MySQL中的很多操作都要依赖于内部临时表来进行优化。但是使用内部临时表需要创建表以及中间数据的存取代价,所以用户在写SQL语句的时候应该尽量的去避免使用临时表。

    内部临时表有两种类型:一种是HEAP临时表,这种临时表的所有数据都会存在内存中,对于这种表的操作不需要IO操作。另一种是OnDisk临时表,这种临时表会将数据存储在磁盘上。OnDisk临时表用来处理中间结果比较大的操作。如果HEAP临时表存储的数据大于MAX_HEAP_TABLE_SIZE,HEAP临时表将会被自动转换成OnDisk临时表。OnDisk临时表在5.7中可以通过INTERNAL_TMP_DISK_STORAGE_ENGINE系统变量选择使用MyISAM引擎或者InnoDB引擎。

    外部临时表用法

    外部临时表是通过CREATE TEMPORARY TABLE及DROP TABLE来操作的,但是SHOW TABLES命令显示数据表列表时,你将无法看到自己创建的临时表的。并且在退出当前会话后,临时表就会被自动删除。也可以手动(DROP TABLE)删除。

    外部临时表使用需要注意的几点:

    1、所用的数据库账号要有建立临时表的权限

    2、在同一条sql中,不能多次关联同一张临时表。否则会报错:

    mysql> select * from temp_t, temp_t as t;
    ERROR 1137 (HY000): Can't reopen table: 'temp_t'

    3、临时表在建立连接时可见,关闭时会清除空间,删除临时表

    4、show tables 不会列出临时表

    5、不能使用rename重命名临时表。但是,你可以alter table代替:只能使用alter table old_tp_table_name rename new_tp_table_name;

    6、影响使用replication功能

    7、如果你为一个表声明了别名,当你指向这个表的时候,就必须使用这个别名

    内部临时表用法

     在书写SQL语句的时候能够尽量少的使用内部临时表进行查询优化,将有效的提高查询执行的效率。以下几种情况,MySQL可能会用到内部临时表:

    1、UNION查询

    2、用到TEMPTABLE算法或者是UNION查询中的视图;

    3、ORDER BY和GROUP BY的子句不一样时;

    4、表连接中,ORDER BY的列不是驱动表中的;

    5、DISTINCT查询并且加上ORDER BY时;

    6、SQL中用到SQL_SMALL_RESULT选项时;

    7、FROM中的子查询;

    8、子查询或者semi-join时创建的表;

    EXPLAIN 查看执行计划结果的 Extra 列中,如果包含 Using temporary 就表示会用到临时表。

    当然了,如果临时表中需要存储的数据量超过了上限( tmp-table-size或 max-heap-table-size中取其大者),这时候就需要生成基于磁盘的临时表了。

    在以下几种情况下,会创建磁盘临时表:

    1、数据表中包含BLOB/TEXT列;

    2、在 GROUP BY 或者 DSTINCT 的列中有超过 512字符 的字符类型列(或者超过 512字节的 二进制类型列,在5.6.15之前只管是否超过512字节);

    3、在SELECT、UNION、UNION ALL查询中,存在最大长度超过512的列(对于字符串类型是512个字符,对于二进制类型则是512字节);、

    4、执行SHOW COLUMNS/FIELDS、DESCRIBE等SQL命令,因为它们的执行结果用到了BLOB列类型。

    从5.7.5开始,新增一个系统选项 internao_tmp_disk_storage_engine可定义磁盘临时表的引擎类型为 InnoDB,而在这以前,只能使用 MyISAM。而在5.6.3以后新增的系统选项 default_tmp_storage_engine 是控制 CREATE TEMPORARY TABLE 创建的临时表的引擎类型,在以前默认是MEMORY,不要把这二者混淆了。

  • 相关阅读:
    HashMap 实现原理
    王东江网站
    网站建设
    mysql 查询 执行流程
    两个线程交替打印1到100
    三个线程交替打印十次ABC
    Java动态链接是什么意思
    双亲委派机制
    笔记
    redis集群搭建
  • 原文地址:https://www.cnblogs.com/jkin/p/12875080.html
Copyright © 2011-2022 走看看