`

mysql 的 内存表和临时表

阅读更多
1 内存表的表机构还是在数据库中的,只是数据时放在内存中的。

2 内存表中不可以使用TEXT和BLOB类型的字段。

3 内存表可以通过max_heap_table_size = 2048M来加大使用的内存。

1 临时表的表机构和数据都是放在内存中的

具体见下:

内存表使用哈希散列索引把数据保存在内存中,因此具有极快的速度,适合缓存中小型数据库。
官方手册对内存表有以下的一些解释:
The MEMORY storage engine creates tables with contents that are stored in memory. Formerly, these were known as HEAP tables. MEMORY is the preferred term, although HEAP remains supported for backward compatibility.

Each MEMORY table is associated with one disk file. The filename begins with the table name and has an extension of .frm to indicate that it stores the table definition.
1、heap对所有用户的连接是可见的,这使得它非常适合做缓存。
2、仅适合使用的场合。heap不允许使用xxxTEXT和xxxBLOB数据类型;只允许使用=和<=>操作符来搜索记录(不允许& amp; lt;、>、<=或>=);mysql4.1版本之前不支持auto_increment;只允许对非空数据列进行索引(not null)。
注:操作符 “<=>” 说明:NULL-safe equal.这个操作符和“=”操作符执行相同的比较操作,不过在两个操作码均为NULL时,其所得值为1而不为NULL,而当一个操作码为NULL时,其所得值为0而不为NULL。
3、一旦服务器重启,所有heap表数据丢失,但是heap表结构仍然存在,因为heap表结构是存放在实际数据库路径下的,不会自动删除。重启之后,heap将被清空,这时候对heap的查询结果都是空的。
4、如果heap是复制的某数据表(创建普通用户表这些也会丢失),则复制之后所有主键、索引、自增等格式将不复存在,需要重新添加主键和索引,如果需要的话。
5、对于重启造成的数据丢失,有以下的解决办法:
 a、在任何查询之前,执行一次简单的查询,判断heap表是否存在数据,如果不存在,则把数据重新写入,或者DROP表重新复制某张表。这需要多做一次查询。不过可以写成include文件,在需要用该heap表的页面随时调用,比较方便。
 b、对于需要该heap表的页面,在该页面第一次且仅在第一次查询该表时,对数据集结果进行判断,如果结果为空,则需要重新写入数据。这样可以节省一次查询。
 c、更好的办法是在mysql每次重新启动时自动写入数据到heap,但是需要配置服务器,过程比较复杂,通用性受到限制。

6、一些预期可能用到的sql语句
//如果表存在,则删除
DROP TABLE IF EXISTS `abc`;
//复制整张表xyz为heap表abc(包含所有数据)
CREATE TABLE `abc` type=heap select * from `xyz`;
//添加主键id
ALTER TABLE `abc` ADD PRIMARY KEY (`id`);
//添加索引username
ALTER TABLE `abc` ADD INDEX `abc` (`username`);
7.建表实例
CREATE TABLE `DB` (
`id` int(11) default NULL,
`songname` varchar(255) NOT NULL default ”,
`singer` varchar(255) NOT NULL default ”,
KEY `songname` (`songname`,`singer`)
) TYPE=HEAP
建表时TABLE TYPE 选项也有
这个表结构就是建立了内存表。
注意:type=heap创建内存表的方式在5.2中将删除,支持的创建方式是最后加上engine=memory.
临时表和内存表的区别:
1)临时表的默认存储引擎是myisam,它的表结构和数据 都是存放在内存中的,当mysql断开连接后,就会将其都删除;
2)内存表的存储引擎是memory,它的表结构信息存放在磁盘中,数据 存放在内存中,当mysql断开连接后,数据会被清空,而表结构信息仍然存在。
另内存表存储引擎memory要比临时表存储引擎myisam快,具体还没有测试。
其它参考:
官方文档: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 server 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确实是very fast,and very useful for creating temporary tables .把临时表和内存表放在一起使用确实会快不少:create table tmp2(id int not null) engine memory;
内存表的建立还有一些限制条件:
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。
另外如何创建内存表?
    创建内存表非常的简单,只需注明 ENGINE= MEMORY 即可:
    CREATE TABLE `tablename` ( `columnName` varchar(256) NOT NUL) ENGINE=MEMORY DEFAULT CHARSET=utf-8 MAX_ROWS=100000000;

或 写成 TYPE=HEAP MAX_ROWS=100000000; 效果是一样的


注意:
    当内存表中的数据大于max_heap_table_size设定的容量大小时,mysql会转换超出的数据存储到磁盘上,因此这是性能就大打折扣了,所以我们还需要根据我们的实际情况调整max_heap_table_size,例如在.cnf文件中[mysqld]的下面加入:
        max_heap_table_size = 2048M
    另外在建表语句中还可以通过MAX_ROWS来控制表的记录数。

内存表使用哈希散列索引把数据保存在内存中,因此具有极快的速度,适合缓存中小型数据库,但是使用上受到一些限制。
分享到:
评论

相关推荐

    Mysql临时表和派生表

    根据存储位置的不同,可以将临时表分为两类:内存临时表和外存临时表。 - **内存临时表(in-memory)**:这种类型的临时表存储在内存中,因此读写速度较快,但不适合存储大量数据或大数据块。 - **外存临时表(on-...

    MySQL性能分析之临时表

    - 内存临时表的大小受到`max_heap_table_size`和`tmp_table_size`两个系统变量的限制。当超过这些限制时,内存临时表会被转化为磁盘临时表。 #### 二、磁盘临时表的产生 磁盘临时表通常是因为某些特定条件导致...

    Mysql临时表使用说明

    ### MySQL临时表使用详解 #### 引言 在处理大规模数据集时,高效的数据操作成为了一项关键技能。MySQL作为一款广泛使用的数据库管理系统,提供了多种工具和策略来优化查询性能。其中,临时表是一个尤为重要的特性...

    MYSQL 临时表用法总结

    - **存储引擎选择**:根据数据量和查询性能需求,可以选择合适的存储引擎,如InnoDB或MyISAM,对于内存临时表则默认使用Memory引擎。 - **资源消耗**:尽管临时表可以提高性能,但如果过多或过大,也可能占用大量...

    MySQL中的两种临时表

    临时表分为两种类型:外部临时表和内部临时表。 外部临时表是通过`CREATE TEMPORARY TABLE`语句创建的,它对当前用户可见,并且仅在当前会话期间存在。这种表的生命周期与会话同步,会话结束后,临时表会自动被删除...

    MySQL 内存分析

    一个计算最大打开文件数的公式为:max(max(wanted_files, max_connections*5), open_files_limit),其中wanted_files表示需要的文件数,它基于最大连接数和表缓存大小计算得出。 对于临时表(tmp_table)的大小,...

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

    如果数据超出这个限制,系统会报错,而不是自动转为磁盘表,与临时表的行为不同。 3. **重启行为**:内存表的表结构是持久化的,存储在`.frm`文件中,因此重启MySQL服务不会丢失表定义。然而,表中的数据是存储在...

    MySQL8.0内存相关参数总结

    这些参数控制着不同操作的内存使用,如排序、连接、读取和临时表。根据工作负载的特点,可以适当调整它们以优化性能,例如,处理大量JOIN操作时,增大`join_buffer_size`可能有所帮助。 在调整这些参数时,需要...

    浅谈MySQL临时表与派生表

    临时表分为内存临时表和磁盘临时表。内存临时表以MEMORY引擎创建,数据存储在内存中,速度快但容量有限。如果内存临时表的大小超过系统变量`max_heap_table_size`和`tmp_table_size`设置的较小值,数据将被写入磁盘...

    Mysql临时表原理及创建方法解析

    MySQL临时表是数据库管理系统中的一种特殊表格,它主要用于在单个会话期间存储临时数据,以便在多个查询之间共享和处理。临时表的生命周期仅限于创建它的会话,一旦会话结束,临时表及其所有数据都会被自动删除,这...

    MySQL临时表空间优化:提升数据库性能的关键

    通过设置 `tmp_table_size` 和 `max_heap_table_size` 来调整内存临时表的大小: ```sql SET GLOBAL tmp_table_size = 512M; SET GLOBAL max_heap_table_size = 512M; ``` 3. **配置 InnoDB 临时表空间** ...

    MySQL临时表的简单用法介绍

    在断开与MySQL的连接后,临时表和其中的数据都会被自动清除。例如,你可以使用以下命令删除临时表: ```sql DROP TABLE tmp_table; ``` 除了常规的临时表,MySQL还支持内存中的临时表(HEAP表)。这类表的所有数据...

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

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

    MySql内存数据库.pdf

    `:创建一个新的数据表,TEMPORARY表示临时表,IF NOT EXISTS用于避免创建重复的表。create_definition定义表中的列,table_options定义表的一些属性,select_statement用于根据已有的表创建新表。 - `SHOW COLUMNS ...

    解析Mysql临时表及特点

    总结来说,Mysql的临时表和内存表在存储数据时有着本质上的区别。临时表是完全基于内存的,没有持久化的数据文件;而内存表则是基于内存的存储引擎,数据也是存储在内存中,但表结构保存在磁盘上。临时表适合解决...

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

    临时表分为内存临时表和磁盘临时表,前者使用memory存储引擎,后者通常使用myisam(在MySQL 5.7.6之前)或innodb(5.7.6之后,默认存储引擎可通过`internal_tmp_disk_storage_engine`参数设置)存储引擎。...

    MySQL优化中的内存计算公式

    本文将详细介绍MySQL内存计算公式,并基于该公式对相关参数进行深入解析。 #### 二、MySQL内存计算公式 根据所提供的内容,MySQL内存占用计算公式如下: \[ \text{MySQLUsedMem} = \text{KeyBufferSize} + \text{...

Global site tag (gtag.js) - Google Analytics