MySQL 記憶體表和臨時表的用法詳解

2022-09-24 14:09:13 字數 3811 閱讀 7386

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 'ttuthtswimp_memory' already exists

root@test 10:16:27>select * from tmp_memory;

+------+

| i |

+------+

| 1 |

+------+

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 |

+--------+-------+

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>

1. 建立的表的名字可以一樣

2. 表結構和資料都放在記憶體中

3. 會話消失表結構和資料都消失

4. 可以建立索引,刪除索引

5. 主庫建立的表,備庫查不到,

6. show ta程式設計客棧bles 看不到表

使用記憶體表需要注意的事項

1. 記憶體表需要自己delete資料或者drop表;需要drop許可權,這點比較危險

2. 記憶體表的表結構是儲存在磁碟上的,如果多個session使用同乙個表名,會存在衝突;如果不需要使用表名,如果使用一次都需要建立表結構,到時候會有很多小檔案存在,不利於db的維護,dba清理表也有風險;

基於以上不適合用記憶體表

1. 臨時表是會話級別的,即使多個session建立的表名一樣,都相互不影響

2. 會話消失,所有的都消失,這點很不利於應用排查問題

另外這兩個都需要消耗額外的記憶體空間,雖然db端可以忍受,但是不太可控;db端還有這個引數:

max_tmp_tables 乙個客戶能同時保持開啟的臨時表的最大數量,這個值預設32,可以根據需要調整此值

補充:mysql建立臨時表,將查詢結果插入已有表中

今天遇到乙個很棘手的問題,想臨時存起來一部分資料,然後再讀取。我記得學資料庫理論課老師說可以建立臨時表,不知道mysql有沒有這樣的功能呢?臨時表在記憶體之中,讀取速度應該比檢視快一些。然後還需要將查詢的結果儲存到臨時表中。

下面是建立臨時表以及插入資料的例子,以供大家www.cppcns.com參考。

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

那如何將查詢的結果存入已有的表呢?

1、可以使用a中第二個方法

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

本文標題: mysql 記憶體表和臨時表的用法詳解

本文位址: /shujuku/mysql/373186.html

mysql記憶體表 臨時表

臨時表 表在記憶體裡,資料在記憶體裡。記憶體表 表在磁碟裡,資料在記憶體裡。my.cnf檔案中修改 臨時表和記憶體表的大小 mysqld 記憶體表容量 max heap table size 1024m 臨時表容量 tmp table size 1024m 建立 記憶體表 注意引擎是memory c...

Mysql 記憶體表和臨時表的區別

記憶體表,就是放在記憶體中的表,所使用記憶體的大小可通過my.cnf中的max heap table size指定,如max heap table size 1024m。臨時表也是存放在記憶體中,臨時表最大所需記憶體需要通過tmp table size 1024m設定。當資料超過臨時表的最大值設定時...

MySQL記憶體表與臨時表

mysql5.5效能優化 記憶體表 記憶體表分為2種,但共同點是,重起資料庫以後,記憶體中的資料全部丟失,記憶體表的功能有部分的限制,有些屬性不能像正常表一樣使用,所以請大家使用的時候謹慎參照官方文件.下面只是拋磚引玉.1.臨時表 表建在記憶體裡,資料在記憶體裡 2.記憶體表 表建在磁碟裡,資料在記...