`
youyu4
  • 浏览: 429229 次
社区版块
存档分类
最新评论

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 |
+------+
row in set (0.00 sec)

 

 

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

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

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

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

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

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

7. 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 |
+--------+-------+
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 |
+---------+-------+
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>

 

 

1. 创建的表的名字可以一样 

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

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

4. 可以创建索引,删除索引

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

6. show tables 看不到表

 

 

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

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

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

 

 

基于以上不适合用内存表

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

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

 

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

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

 

 

参考:

http://www.cnblogs.com/sunss/archive/2013/07/15/3191137.html

分享到:
评论

相关推荐

    浅谈MySQL临时表与派生表

    对于自动创建的临时表,由于内存临时表的性能更为优越,mysql总是首先使用内存临时表,而当内存临时表变得太大时,达到某个阈值的时候,内存临时表就转存为外存临时表。也就是说,外存临时表是内存临时表在存储空间...

    深度解析MySQL 5.7之临时表空间

    在MySQL里面这种临时表对应的是内存表,即memory引擎。 2、会话级别临时表 这种临时表在用户登录系统成功后生效,在用户退出时失效。在MySQL里的临时表指的就是以create temporary table 这样的关键词创建的表。 3...

    MySQL内存表的特性与使用介绍

    临时表和内存表都可以人工创建,但临时表更多的作用是系统自己创建后,组织数据以提升性能,如子查询,临时表在多个连接之间不能共享。这里只讨论内存表

    解析Mysql临时表及特点

    临时表是当连接没有断开时存在,一旦断开就不会存在,临时表的数据和结构都在内存中,可以做个测验,你创建一个临时表,但是到响应的数据目录下并不会找到.frm文件mysql> CREATE TEMPORARY TABLE tmp_table ( -> -...

    MySQL的内存表的基础学习教程

    内存表,就是放在内存中的表,所使用内存的大小可通过My.cnf中的max_heap_table_size指定,如max_heap_table_size=1024M,内存表与临时表并不相同,临时表也是存放在内存中,临时表最大所需内存需要通过tmp_table_...

    mysql服务性能优化my_cnf配置说明详解16G内存[参考].pdf

    如果表缓存满了,则会按照一定的规则将当前未用的表释放,或者临时扩大表缓存来存放。通过查看数据库运行峰值时间的状态值 Open_tables 和 Opened_tables,可以判断是否需要增加 table_cache 的值。 4. 排序缓存...

    MySQL问答系列之什么情况下会用到临时表

    内存临时表采用的是memory存储引擎,磁盘临时表采用的是myisam存储引擎(磁盘临时表也可以使用innodb存储引擎,通过internal_tmp_disk_storage_engine参数来控制使用哪种存储引擎,从mysql5.7.6之后默认为innodb存储...

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

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

    MYSQL

    10.2.7 MySQL 怎样使用内存 10.2.8 MySQL 怎样锁定数据库表 10.2.9 数据库表级锁定的问题 10.3 使你的数据尽可能小 10.4 MySQL 索引的使用 10.5 存取或更新数据的查询速度 10.5.1 估计...

    MySQL中文参考手册.chm

    10.2.7 MySQL 怎样使用内存 10.2.8 MySQL 怎样锁定数据库表 10.2.9 数据库表级锁定的问题 10.3 使你的数据尽可能小 10.4 MySQL 索引的使用 10.5 存取或更新数据的查询速度 ...

    MySQL中文参考手册

    + 4.12.6 MySQL-Win32与Unix MySQL 比较 o 4.13 OS/2 注意事项 o 4.14 TcX 二进制代码 o 4.15 安装后期(post-installation)的设置与测试 + 4.15.1 运行mysql_install_db 的问题 + 4.15.2 启动 MySQL 服务器的...

    MySQL 5.1中文手冊

    7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端和实用工具程序 8.1. 客户端脚本和实用工具概述 8.2. myisampack:生成压缩、只读MyISAM表 8.3. mysql:MySQL命令行...

    浅析MySQL内存的使用说明(全局缓存+线程缓存)

    首先我们来看一个公式,MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的 部分): 代码如下:per_thread_buffers=(read_buffer_size+read_rnd_buffer_size+sort_buffer_size+thread_...

    MySQL 5.1官方简体中文参考手册

    7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端和实用工具程序 8.1. 客户端脚本和实用工具概述 8.2. myisampack:生成压缩、只读MyISAM表 8.3. mysql:MySQL命令行...

    mysql数据库my.cnf配置文件

    # 大多数临时表是基于内存的(HEAP)表。具有大的记录长度的临时表 (所有列的长度的和)或包含BLOB列的表存储在硬盘上。 # 如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表...

    MySQL占用内存较大与CPU过高测试与解决办法

    tmp_table_size=102M ->64M 临时表大小 key_buffer_size=256m ->32M 重启mysql服务后,虚拟内存降到200以下. 另外mysql安装目录下有几个文件:my-huge.ini 、my-large.ini、my-medium.ini…这几个是根据内存大小...

    MySQL内存使用之线程独享介绍

    在 MySQL 中,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,如线程栈信息,分组排序操作,数据读写缓冲,结果集暂存等等,而且大多数可以通过相关参数来控制内存的使用量。 线程栈信息使用内存...

    MySQL 5.1参考手册

    7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端和实用工具程序 8.1. 客户端脚本和实用工具概述 8.2. myisampack:生成压缩、只读MyISAM表 8.3. mysql:MySQL命令行...

Global site tag (gtag.js) - Google Analytics