mysql创建临时表,将查询结果插⼊已有的表
A、临时表再断开于mysql的连接后系统会⾃动删除临时表中的数据,但是这只限于⽤下⾯语句建⽴的表:
1)定义字段
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
time date NOT NULL
)
更⾼级点就是:
create temporary TABLE `temtable` (
`jws` varchar(100) character set utf8 collate utf8_bin NOT NULL,
`tzlb` varchar(100) character set utf8 collate utf8_bin NOT NULL,
distinct查询`uptime` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1″
连编码⽅式都规定了。。呵呵,以防乱码啊。
2)直接将查询结果导⼊临时表
CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name
B、另外mysql也允许你在内存中直接创建临时表,因为是在内存中所有速度会很快,语法如下:
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
) TYPE = HEAP
那如何将查询的结果存⼊已有的表呢?
1、可以使⽤A中第⼆个⽅法
2、使⽤insert into temtable (select a,b,c,d from tablea)”;
⾸先,临时表只在当前连接可见,当关闭连接时,Mysql会⾃动删除表并释放所有空间。因此在不同的连接中可以创建同名的临时表,并且操作属于本连接的临时表。
创建临时表的语法与创建表语法类似,不同之处是增加关键字TEMPORARY,如:
CREATE TEMPORARY TABLE 表名 (…. )
临时表使⽤有⼀些限制条件:
* 临时表在 memory、myisam、merge或者innodb上使⽤,并且不⽀持mysql cluster簇);
show tables语句不会列出临时表,在information_schema中也不存在临时表信息;show create table可以查看临时表;
* 不能使⽤rename来重命名临时表。但是可以alter table rename代替:
mysql>ALTER TABLE orig_name RENAME new_name;
* 可以复制临时表得到⼀个新的临时表,如:
mysql>create temporary table new_table select * from old_table;
* 但在同⼀个query语句中,相同的临时表只能出现⼀次。如:
可以使⽤:mysql> select * from temp_tb;
但不能使⽤:mysql> select * from temp_tb, temp_tb as t;
错误信息: ERROR 1137 (HY000): Can't reopen table: 'temp_tb'
同样相同临时表不能在存储函数中出现多次,如果在⼀个存储函数⾥,⽤不同的别名查⼀个临时表多次,或者在这个存储函数⾥⽤不同的语句查,都会出现这个错误。
* 但不同的临时表可以出现在同⼀个query语句中,如临时表temp_tb1, temp_tb2:
Mysql> select * from temp_tb1, temp_tb2;
临时表可以⼿动删除:
DROP TEMPORARY TABLE IF EXISTS temp_tb;
临时表主要⽤于对⼤数据量的表上作⼀个⼦集,提⾼查询效率。
在创建临时表时声明类型为HEAP,则Mysql会在内存中创建该临时表,即内存表:如:
CREATE TEMPORARY TABLE 表名 (。。。。) TYPE = HEAP
因为HEAP表存储在内存中,你对它运⾏的查询可能⽐磁盘上的临时表快些。如:
mysql> create temporary table temp_tb type='heap' select * from temptb;
Query OK, 0 rows affected, 1 warning (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table temp_tb \G;
*************************** 1. row ***************************
Table: temp_tb
Create Table: CREATE TEMPORARY TABLE `temp_tb` (
`id` int(10) unsigned NOT NULL DEFAULT '0',
`Name` char(20) NOT NULL,
`Age` tinyint(4) NOT NULL
) ENGINE=MEMORY DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
ERROR:
No query specified
可以看出来临时表和内存表的ENGINE 不同,临时表默认的是Mysql指定的默认Engine,⽽内存表是MEMORY。
官⽅⼿册:
As indicated by the name, MEMORY tables are stored in memory. They use hash indexes by default, which makes them very fast, and very useful for creating temporary tables. However, when the serve
r shuts down, all rows stored in MEMORY tables are lost. The tables themselves continue to exist because their definitions are stored in .frm files on disk, but they are empty when the server restarts.
内存表的建⽴还有⼀些限制条件:
MEMORY tables cannot contain BLOB or TEXT columns. HEAP不⽀持BLOB/TEXT列。
The server needs sufficient memory to maintain all MEMORY tables that are in use at the same time. 在同⼀时间需要⾜够的内存.
To free memory used by a MEMORY table when you no longer require its contents, you should execute DELETE or TRUNCATE TABLE, or remove the table altogether using DROP TABLE.为了释放内存,你应该执⾏DELETE FROM heap_table或DROP TABLE heap_table。
临时表和内存表
临时表主要是为了放⼀些中间⼤结果集的⼀些⼦集,内存表可以放⼀些经常频繁使⽤的数据。
* 临时表:表建在内存⾥,数据在内存⾥
* 内存表:表建在磁盘⾥,数据在内存⾥
临时表和内存表所使⽤内存⼤⼩可以通过Myf中的max_heap_table_size、tmp_table_size指定:
[mysqld]
max_heap_table_size=1024M #内存表容量
tmp_table_size=1024M #临时表容量
当数据超过临时表的最⼤值设定时,⾃动转为磁盘表,此时因需要进⾏IO操作,性能会⼤⼤下降,⽽内存表不会,内存表满后,则会提⽰数据满错误。
show tables 命令不会显⽰临时表。
以下是对内存表和临时表之间区别的总结:
内存表:
1.缺省存储引擎为MEMORY
2.可以通过参数max_heap_table_size来设定内存表⼤⼩
3.到达max_heap_table_size设定的内存上限后将报错
4.表定义保存在磁盘上,数据和索引保存在内存中
5.不能包含TEXT、BLOB等字段
临时表:
1.缺省存储引擎为MySQL服务器默认引擎,引擎类型只能是:memory(heap)、myisam、merge、innodb(memory临时表由于表的增⼤可能会转变为myisam临时表)
2.可以通过参数 tmp_table_size 来设定临时表⼤⼩。
3.到达tmp_table_size设定的内存上限后将在磁盘上创建临时⽂件
4.表定义和数据都保存在内存中
5.可以包含TEXT, BLOB等字段
临时表⼀般⽐较少⽤,通常是在应⽤程序中动态创建或者由MySQL内部根据SQL执⾏计划需要⾃⼰创建。
内存表则⼤多作为Cache来使⽤,特别在没有第三⽅cache使⽤时。如今随着memcache、NoSQL的
流⾏,越来越少选择使⽤内存表。
MySQL服务器使⽤内部临时表
在某些情况下,mysql服务器会⾃动创建内部临时表。查看查询语句的执⾏计划,如果extra列显⽰“using temporary”即使⽤了内部临时表。内部临时表的创建条件:
* group by 和 order by中的列不相同
* order by的列不是引⽤from 表列表中的第⼀表
* group by的列不是引⽤from 表列表中的第⼀表
* 使⽤了sql_small_result选项
* 含有distinct 的 order by语句
初始创建内部myisam临时表的条件:
* 表中存在text、blob列
* 在group by中的列有超过512字节
* 在distinct查询中的列有超过512字节
* 在union、union all联合查询中,select 列列表中的列有超过512字节的
如果实在⽆法避免,也应该尽量避免使⽤磁盘临时表。
常见的⽅法有:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论