記憶體表和臨時表的區別
記憶體表:
1. 引數控制:max_heap_table_size
2. 到達上線後報錯。
3. 表定義儲存在磁碟上,資料和索引儲存在記憶體裡面。
4. 不能包含TEXT,BLOB等欄位。
臨時表:
1. 引數控制:tmp_table_size。
2. 到達上線後建立檔案在磁碟上。
3. 表定義和資料都在記憶體裡。
4. 可以包含TEXT, BLOB等欄位。
由於直接使用臨時表來建立中間表,其速度不如人意,因而就有了把臨時表建成記憶體表的想法。但記憶體表和臨時表的區別且並不熟悉,需要查詢資料了。
一開始以為臨時表是建立後存在,當連線斷開時臨時表就會被刪除,即臨時表是存在於磁碟上的。而實際操作中發現臨時表建立後去目錄下檢視發現並沒有發現對應的臨時表檔案(未斷開連結).因而猜測臨時表的資料和結構都是存放在記憶體中,而不是在磁碟中.
這樣一想記憶體表不是也是存在在記憶體中嗎,那麼他和臨時表有什麼區別?他們的速度是什麼樣子?
查詢了官方手冊有以下的一些解釋:
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。
1. 引數控制:max_heap_table_size
2. 到達上線後報錯。
3. 表定義儲存在磁碟上,資料和索引儲存在記憶體裡面。
4. 不能包含TEXT,BLOB等欄位。
臨時表:
1. 引數控制:tmp_table_size。
2. 到達上線後建立檔案在磁碟上。
3. 表定義和資料都在記憶體裡。
4. 可以包含TEXT, BLOB等欄位。
由於直接使用臨時表來建立中間表,其速度不如人意,因而就有了把臨時表建成記憶體表的想法。但記憶體表和臨時表的區別且並不熟悉,需要查詢資料了。
一開始以為臨時表是建立後存在,當連線斷開時臨時表就會被刪除,即臨時表是存在於磁碟上的。而實際操作中發現臨時表建立後去目錄下檢視發現並沒有發現對應的臨時表檔案(未斷開連結).因而猜測臨時表的資料和結構都是存放在記憶體中,而不是在磁碟中.
這樣一想記憶體表不是也是存在在記憶體中嗎,那麼他和臨時表有什麼區別?他們的速度是什麼樣子?
查詢了官方手冊有以下的一些解釋:
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。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29012686/viewspace-1132516/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql臨時表和記憶體表MySql記憶體
- 【轉載】MySQL之臨時表和記憶體表MySql記憶體
- 記憶體(memory)表和臨時(temporary)表之瞭解記憶體
- MySQL-37:記憶體臨時表MySql記憶體
- SQL Server中臨時表與表變數的區別SQLServer變數
- SQLSERVER 臨時表和表變數到底有什麼區別?SQLServer變數
- ORACLE臨時表和SQLSERVER臨時表異同OracleSQLServer
- 排序sort area 記憶體不足會用到臨時表空間排序記憶體
- TimesTen臨時(記憶體)空間使用和調整臨時(記憶體)空間記憶體
- mysql cluster ndb 記憶體表和磁碟表MySql記憶體
- 再議臨時表和表變數變數
- Oracle 基礎 ----臨時表和物件表Oracle物件
- SQL Server中的臨時表和表變數SQLServer變數
- java記憶體溢位和記憶體洩漏的區別Java記憶體溢位
- 表變數和臨時表的差別 (以前把表變數叫成變數表了,哎。。。)變數
- mysql複製和記憶體引擎的表MySql記憶體
- 記憶體表(FDMEMTABLE)記憶體
- Oracle的臨時表Oracle
- 臨時表的操作
- optee記憶體管理和頁表建立記憶體
- 【基礎知識】基於事物的臨時表和基於會話的臨時表會話
- TempDB 中表變數和區域性臨時表的對比變數
- Sqlserver 關於臨時表和表變數的總結SQLServer變數
- MySQL臨時表MySql
- PostgreSQL:臨時表SQL
- oracle臨時表Oracle
- Oracle 臨時表Oracle
- 【知識分享】伺服器記憶體和普通記憶體的區別伺服器記憶體
- mysql最大表記憶體MySql記憶體
- 遊戲記憶體對比普通記憶體區別 遊戲記憶體和普通記憶體相差大嗎?遊戲記憶體
- Hive內部表和外部表的區別Hive
- oracle 臨時表的使用Oracle
- MySQL 中的臨時表MySql
- SQLServer臨時表的使用SQLServer
- oracle臨時表的用法Oracle
- 會話與事務級臨時表和dual表會話
- SQLServer表變數和臨時表系列之概念篇SQLServer變數
- 【臨時表空間】11g中使用 SHRINK方法縮小臨時表空間和臨時檔案