定义:
临时表是建立在系统临时文件夹中的表,如果使用得当,完全可以像普通表一样进行各种操作,在VFP退出时自动被释放。
特点:
临时表用于保存一些临时数据;
临时表只在当前连接可见。当关闭连接时,MySQL会删除临时表,释放所有资源;
临时表的数据和表结构都存储在内存中,内存表
溯源:
临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。
创建临时表:
#创建临时表
mysql> CREATE TEMPORARY TABLE SalesSummary (
product_name VARCHAR(50) NOT NULL
, total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
, avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
, total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
Query OK, 0 rows affected
#插入数据
mysql> INSERT INTO SalesSummary
(product_name, total_sales, avg_unit_price, total_units_sold)
VALUES
('cucumber', 100.25, 90, 2);
Query OK, 1 row affected
#查询数据
mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber | 100.25 | 90 | 2 |
+--------------+-------------+----------------+------------------+
1 row in set
#这里我们查询数据库的表格,临时表是看不到的;
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user |
+----------------+
1 row in set
#虽然关闭连接,会自动销毁;我们也可以自己销毁
mysql> DROP TABLE SalesSummary;
Query OK, 0 rows affected
mysql> SELECT * FROM SalesSummary;
1146 - Table 'test.salessummary' doesn't exist
mysql>
注意:
如果创建的临时表和数据库原有的表格的名字相同时,原有原有的表格是不可见的;
#数据库原表
mysql> select * from user;
+----+------+
| id | name |
+----+------+
| 12 | qwq |
| 13 | 2ewe |
+----+------+
2 rows in set
#创建同名的临时表
mysql> create temporary table user (id int,sex int);
Query OK, 0 rows affected
#临时表插入数据
mysql> insert into user (id,sex) values (1,0);
Query OK, 1 row affected
#原表覆盖
mysql> select * from user;
+----+-----+
| id | sex |
+----+-----+
| 1 | 0 |
+----+-----+
1 row in set
在MySQL5.7版本之前,临时表的存储引擎默认为myisam,myisam临时表在SQL执行结束后,会自动删除临时表。然而从5.7版本开始,临时表的默认存储引擎变为innodb,虽然在性能上有了一定的提升,但是由于innodb引擎的临时表共用表空间ibtmp1,导致在高并发下,多个session同时创建临时表时,该表空间会变得非常大,并且不能动态缩小,除非重启MySQL,否则无法释放。(innodb关闭连接临时表会销毁的,注意区分)
解决方法:将临时表的存储引擎设置成为myisam;
优点:
客户端新建了一个会话,这个会话只是服务器与客户端1对1的关系,客户端可能在服务端建立一个临时表,满足客户端处理某些事务的需求,当客户端退出会话后,这个临时表自动drop,没有任何数据信息占用数据库空间。
客户端建立临时表只为特定的事务服务,这个表具有专用和私有性,不需要共享给其他人。
客户端建立的临时表具有单独操作和读写性能,因此速度上和处理效率上更高,这
应用场景:
1.短期内有很多DML操作,比如说网购的购物车,放入东西(insert)、添加数量(update)、删除商品(delete),但是一旦你结算完成以后,你的这些数据就不再需要了,可以使用临时表存储;
2.导出部分数据时,当一个中转站;
3.很多张联查时,可以先部分联查,保存到临时表,然后使用临时表联查;