我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL 内存表和临时表的用法详解

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL 内存表和临时表的用法详解

内存表:


session 1
$ mysql -uroot
root@(none) 10:05:06>use test
Database changed
root@test 10:06:06>CREATE TABLE tmp_memory (i INT) ENGINE = MEMORY;
Query OK, 0 rows affected (0.00 sec)
root@test 10:08:46>insert into tmp_memory values (1);
Query OK, 1 row affected (0.00 sec)
root@test 10:08:46>
session2
$ mysql -uroot test
root@test 10:05:12>CREATE TABLE tmp_memory (i INT) ENGINE = MEMORY;
ERROR 1050 (42S01): Table 'tmp_memory' already exists
root@test 10:16:27>select * from tmp_memory;
+------+
| i |
+------+
| 1 |
+------+
1 row in set (0.00 sec)

多个session,创建表的名字不能一样

一个session创建会话后,对其他session也是可见的

data目录下只有tmp_memory.frm ,表结构放在磁盘上,数据放在内存中

mysql 重启或者关闭后内存表里的数据会丢失,但是表结构仍然存在

可以创建索引,删除索引,支持唯一索引

不影响主备,主库上插入的数据,备库也可以查到

show tables 看得到表

临时表:


session1
$ mysql -uroot test
root@test 10:30:18>CREATE TEMPORARY TABLE tmp_table (name VARCHAR(10) NOT NULL,value INTEGER NOT NULL);
Query OK, 0 rows affected (0.05 sec)
root@test 10:31:54>select * from tmp_table;
+--------+-------+
| name | value |
+--------+-------+
| aaaaaa | 10 |
+--------+-------+
1 row in set (0.00 sec)
session2
root@test 10:20:13> CREATE TEMPORARY TABLE tmp_table (name VARCHAR(10) NOT NULL,value INTEGER NOT NULL);
Query OK, 0 rows affected (0.02 sec)
root@test 10:30:39>insert into tmp_table values ('bbbbbbb',10);
Query OK, 1 row affected (0.01 sec)
root@test 10:31:33>select * from tmp_table;
+---------+-------+
| name | value |
+---------+-------+
| bbbbbbb | 10 |
+---------+-------+
1 row in set (0.00 sec)
root@test 10:31:43>exit
Bye
[1 Single:MS-Master db152011.sqa.cm6: mysql ~ ]
$ mysql -uroot test
root@test 10:32:17>select * from tmp_table;
ERROR 1146 (42S02): Table 'test.tmp_table' doesn't exist
root@test 10:32:22>
root@test 10:32:23>

创建的表的名字可以一样

表结构和数据都放在内存中

会话消失表结构和数据都消失

可以创建索引,删除索引

主库创建的表,备库查不到,

show tables 看不到表

使用内存表需要注意的事项

内存表需要自己delete数据或者drop表;需要drop权限,这点比较危险

内存表的表结构是保存在磁盘上的,如果多个session使用同一个表名,会存在冲突;如果不需要使用表名,如果使用一次都需要创建表结构,到时候会有很多小文件存在,不利于db的维护,dba清理表也有风险;

基于以上不适合用内存表

临时表是会话级别的,即使多个session创建的表名一样,都相互不影响

会话消失,所有的都消失,这点很不利于应用排查问题

另外这两个都需要消耗额外的内存空间,虽然db端可以忍受,但是不太可控;DB端还有这个参数:

max_tmp_tables 一个客户能同时保持打开的临时表的最大数量,这个值默认32,可以根据需要调整此值

补充:mysql创建临时表,将查询结果插入已有表中

今天遇到一个很棘手的问题,想临时存起来一部分数据,然后再读取。我记得学数据库理论课老师说可以创建临时表,不知道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,
 `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

那如何将查询的结果存入已有的表呢?

可以使用A中第二个方法

使用insert into temtable (select a,b,c,d from tablea)”;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持自学编程网。如有错误或未考虑完全的地方,望不吝赐教。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL 内存表和临时表的用法详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL 内存表和临时表的用法详解

内存表:session 1 $ mysql -uroot root@(none) 10:05:06>use test Database changed root@test 10:06:06>CREATE TABLE tmp_memory (
2022-05-23

MySQL中的临时表与内存表

临时表和内存表均为MySQL中用于存储特定会话或查询结果的表。临时表由特定会话创建并自动删除,而内存表存储在服务器内存中,数据不持久化。临时表仅对创建它们的会话可见,而内存表对所有会话可见。临时表数据在会话结束时删除,而内存表数据在服务器重启或崩溃时丢失。临时表性能通常比持久表快,而内存表提供最佳性能。临时表用于存储中间查询结果或临时数据,而内存表用于存储经常访问的数据。在选择临时表还是内存表时,需要考虑持久性、性能、内存使用和表大小等因素。
MySQL中的临时表与内存表
2024-04-02

mysql临时表(temporary table)使用方法详解

临时表是MySQL中用于存储临时数据的特殊表。创建临时表的方法有两种:使用CREATETEMPORARYTABLE语句或使用#前缀。临时表的特点包括会话范围、自动删除以及名称唯一性。临时表通常用于快速处理、排序或分组数据,而不影响永久表。例如,可以创建临时表来排序分组员工数据,以获取每个员工的总工资。临时表与永久表的主要区别在于会话范围和自动删除机制。临时表仅存在于当前会话中,会话结束后自动删除。最佳实践包括使用索引、使用适当大小、及时删除和避免滥用。
mysql临时表(temporary table)使用方法详解
2024-04-02

Mysql临时表及分区表区别详解

临时表与内存表 内存表,指的是使用Memory引擎的表,建表语法是create table … engine=memory。这种 表的数据都保存在内存,系统重启的时候会被清空,但是表结构还在。除这两个特性看 上去比较“奇怪”外,从其他的特征
2022-05-26

MySQL临时表满了/临时表空间耗尽的解决方法

目录解决办法在 mysql 中,当你收到“临时表满了”的警报时,通常意味着 MySQL 在处理查询时创建的临时表空间已经耗尽。这可能会导致查询失败或性能下降。临时表通常用于处理一些需要排序、分组、或者使用临时数据存储
MySQL临时表满了/临时表空间耗尽的解决方法
2024-08-14

第05问:MySQL 在处理临时结果集时,内部临时表会使用多少内存?

问题:MySQL 在处理临时结果集(UNION 运算 / 聚合运算等)时,会用到内部临时表(internal temporary table)。那么内部临时表会使用多少内存呢?实验:我们先创建一个测试用的数据库,然后准备好数据,我们使用一个带 UNION 的子
第05问:MySQL 在处理临时结果集时,内部临时表会使用多少内存?
2018-08-15

mysql临时表的使用方法是什么

在MySQL中,临时表是一种特殊类型的表,它只在当前会话中存在并且在会话结束时会自动被销毁。临时表对于临时存储中间结果或者处理大量数据时非常有用。创建临时表的语法如下:CREATE TEMPORARY TABLE temp_table_
mysql临时表的使用方法是什么
2024-04-09

MySQL临时表使用的方法是什么

在MySQL中,可以使用以下方法创建和使用临时表:使用CREATE TEMPORARY TABLE语句创建临时表:CREATE TEMPORARY TABLE temp_table_name (column1 datatype,column
MySQL临时表使用的方法是什么
2024-05-06

MySQL中临时表的使用示例

这两天事情稍微有点多,公众号也停止更新了几天,结果有读者催更了,也是,说明还是有人关注,利己及人,挺好。 今天分享的内容是MySQL中的临时表,对于临时表,之前我其实没有过多的研究,只是知道MySQL在某些特定场景下会使用临
2022-05-22

mysql临时表的作用是什么

今天小编给大家分享一下mysql临时表的作用是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
2023-05-25

编程热搜

目录