由于直接使用临时表来创建中间表,其速度不如人意,因而就有了把临时表建成内存表的想法。但内存表和临时表的区别且并不熟悉,需要查找资料了。
一开始以为临时表是创建后存在,当连接断开时临时表就会被删除,即临时表是存在于磁盘上的。而实际操作中发现临时表创建后去目录下查看发现并没有发现对应的临时表文件(未断开链接).因而猜测临时表的数据和结构都是存放在内存中,而不是在磁盘中.
这样一想内存表不是也是存在在内存中吗,那么他和临时表有什么区别?他们的速度是什么样子?
查找了官方手册有以下的一些解释:
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.
由此可以看出来内存表会把表结构存放在磁盘上,把数据放在内存中。
并做了以下实验:
临时表
- mysql> create temporary table tmp1(id int not null);
- Query OK, 0 rows affected (0.00 sec)
- mysql> show create table tmp1;
- +-------+----------------------------------------------------------------------------------------------+
- | Table | Create Table |
- +-------+----------------------------------------------------------------------------------------------+
- | tmp1 | CREATE TEMPORARY TABLE `tmp1` ( `id` int(11) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
- +-------+----------------------------------------------------------------------------------------------+
- 1 row in set (0.00 sec)
内存表
- mysql> create table tmp2(id int not null) TYPE=HEAP;
- Query OK, 0 rows affected (0.00 sec)
- mysql> show create table tmp2;
- +-------+------------------------------------------------------------------------------------+
- | Table | Create Table |
- +-------+------------------------------------------------------------------------------------+
- | tmp2 | CREATE TABLE `tmp2` (
- `id` int(11) NOT NULL
- ) ENGINE=MEMORY DEFAULT CHARSET=utf8 |
- +-------+------------------------------------------------------------------------------------+
- 1 row in set (0.00 sec)
可以看出来临时表和内存表的ENGINE 不同,临时表默认的是MyISAM,而内存表是MEMORY .去数据库目录查看,发现tmp2.frm而没有tmp1表的任何文件。看来实际情况是符合官方解释的。
那么速度方面呢(即MyISAM和MEMORY之间的区别)?
实验开始:
实现手段:对基于2张千万级别的表做一些OLAP切分操作,中间表的建立使用2种不同的方式。最后把中间表的数据按照要求取出,插入到结果表中
实验目的;测试临时内存表和临时表的速度
1.中间表的建立使用Create temporary table type = heap 即 把中间表建立成临时内存表
2.中间表直接使用Create temporary table建立
实验结果:
临时内存表: 1小时
1 2008-09-25 11:03:48
1 2008-09-25 12:03:39
临时表:1小时17分钟
2 2008-09-25 12:25:28
2 2008-09-25 13:42:37
由此发现MEMORY比MyISAM快大概20%。
接着查找官方手册:
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。
相关推荐
根据存储位置的不同,可以将临时表分为两类:内存临时表和外存临时表。 - **内存临时表(in-memory)**:这种类型的临时表存储在内存中,因此读写速度较快,但不适合存储大量数据或大数据块。 - **外存临时表(on-...
通过设置 `tmp_table_size` 和 `max_heap_table_size` 来调整内存临时表的大小: ```sql SET GLOBAL tmp_table_size = 512M; SET GLOBAL max_heap_table_size = 512M; ``` 3. **配置 InnoDB 临时表空间** ...
9. 定期维护:包括重建索引、清理无用的临时表、更新统计信息等,以保持数据库健康。 10. 监控和调优工具:如MySQL Tuner和Percona Toolkit,帮助分析数据库性能,提供改进建议。 综上所述,理解和掌握MySQL的索引...
- 内存临时表的大小受到`max_heap_table_size`和`tmp_table_size`两个系统变量的限制。当超过这些限制时,内存临时表会被转化为磁盘临时表。 #### 二、磁盘临时表的产生 磁盘临时表通常是因为某些特定条件导致...
临时表可以是基于内存的,也可以存储在磁盘上,具体取决于数据量和系统资源。 - **查看Temporary Tables使用情况**: ```sql SHOW STATUS LIKE 'Created_tmp_disk_tables'; SHOW STATUS LIKE 'Created_tmp_files...
### 2G内存的MySQL数据库服务器优化 在IT行业中,对于资源有限的环境进行数据库优化是一项挑战性工作,尤其是在仅有2GB内存的情况下对MySQL数据库服务器进行优化。这种优化旨在提高性能的同时确保系统的稳定运行。 ...
3. **性能测试与优化**:通过对比直接查询与使用临时表的方式,可以评估查询性能,帮助优化数据库结构和查询语句。 #### 使用技巧与注意事项 1. **测试与验证**:尽管在理论上临时表能提升查询效率,但在实际应用...
- 性能最佳,但断电后数据会丢失,适合做临时表。 #### MyISAM vs InnoDB 特点对比 - **MyISAM** - 简单的数据存储方式,使用B+树索引。 - 文件格式包括`.MYI`(索引文件)、`.MYD`(数据文件)和`frm`(定义...
MySQL中的临时表是数据库在处理复杂查询和性能优化时的重要工具。临时表分为两种类型:外部临时表和内部临时表。 外部临时表是通过`CREATE TEMPORARY TABLE`语句创建的,它对当前用户可见,并且仅在当前会话期间...
### MySQL优化中的内存计算公式详解 #### 一、引言 在MySQL数据库的运维与优化过程中,合理配置内存参数对于提升系统性能至关重要。通过精确计算MySQL服务器所占用的内存,可以有效避免因内存不足导致的服务不可用...
注意`Extra`列中的`Using filesort`和`Using temporary table`,这些表明了MySQL需要额外的资源进行排序或创建临时表,可能是优化的焦点。 3. **索引优化** - 选择合适的列建立索引:考虑选择具有高选择性的列,即...
关键参数包括缓冲池大小(innodb_buffer_pool_size)、排序缓冲区(sort_buffer_size)和临时表空间。 5. **并发控制**:通过调整并发连接数(max_connections)、线程池大小(thread_cache_size)等参数,平衡系统...
### 释放MySQL性能:优化查询的艺术 ...通过具体的代码示例和策略建议,希望能够帮助读者更好地理解和实施MySQL查询优化,从而提升数据库的响应速度和整体性能。记住,优化是一个持续的过程,需要不断地评估和调整。
MySQL 服务性能优化 My.cnf 配置说明详解(16G 内存) MySQL 是当前使用最广泛的开源数据库管理系统之一,高性能的 MySQL 服务器配置是每个开发者和 DBA 都需要关心的问题。下面是 MySQL 服务性能优化的 My.cnf ...
### Windows平台MySQL优化配置 在Windows平台上对MySQL进行优化配置是一项重要的任务,它不仅能够提升数据库系统的性能,还能确保数据处理的效率与安全性。本文将详细介绍如何针对Windows平台下的MySQL服务器进行...
6. JOIN 优化:避免笛卡尔积,合理使用 INNER JOIN 和 OUTER JOIN,减少临时表的使用。 7. 表设计优化:采用正常化设计,减少冗余数据;考虑数据类型的选择,减少存储空间。 8. 使用慢查询日志:监控慢查询,找出...
- **存储引擎选择**:根据数据量和查询性能需求,可以选择合适的存储引擎,如InnoDB或MyISAM,对于内存临时表则默认使用Memory引擎。 - **资源消耗**:尽管临时表可以提高性能,但如果过多或过大,也可能占用大量...
- **分页查询优化**:使用OFFSET和LIMIT时,采用子查询或临时表等技术减少数据加载量。 - **慢查询日志分析**:开启慢查询日志功能,监控并分析执行时间过长的SQL语句。 #### 六、进阶技巧与工具推荐 ##### 6.1 ...
max_heap_table_size和tmp_table_size选项影响到内存中临时表的大小;thread_cache_size选项有助于缓存空闲线程,减少创建新线程的开销;thread_concurrency选项指定了同时运行的线程数量;wait_timeout选项定义了...