mysql之記憶體表

2022-03-10 23:18:30 字數 2765 閱讀 2700

昨天下午老大讓我查資料看一下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 |

+------+

1 row in

set (0.00

sec)

複製**

1. 多個session,建立表的名字不能一樣

2. 乙個session建立會話後,對其他session也是可見的

3. data目錄下只有tmp_memory.frm ,表結構放在磁碟上,資料放在記憶體中

4. mysql 重啟或者關閉後記憶體表裡的資料會丟失,但是表結構仍然存在

5. 可以建立索引,刪除索引,支援唯一索引

6. 不影響主備,主庫上插入的資料,備庫也可以查到

7. show tables 看得到表

view code

「記憶體表」顧名思義建立在記憶體中的表,真是這樣嗎?其實不然,mysql的記憶體表,表結構建立在磁碟上,資料存放在記憶體中,所以當mysql啟動著的時候,這個表是存在的,資料也是存在的,如果使用者有檢視這個表的許可權,在所有會話裡面,都可以訪問這個記憶體表的資料;當mysql重啟後,資料消失,結構還存在。

記憶體表的建立:

create table test(

id int(10

), num

int(10

)) engine=memory default charset=utf8;

檢視是否建立成功:

show tables;

使用完記憶體表後,如果我們想釋放掉占用掉的記憶體,可以有兩種方法:

--刪除資料

delete

from

test;

或者--清空表

truncate table test;

再或者--刪除表

drop table test;

對於我們常用的功能來說,記憶體有以下特徵:

1.對於varchar等變長型別,記憶體表使用固定的長度來存放;

2.記憶體表可以有非唯一鍵;

3.記憶體表不能包含blob或者text列;

4.記憶體表支援auto_increment列;

5.記憶體表支援插入延遲,使讀取優先;

6.非臨時記憶體表和其它非記憶體表一樣在所有客戶端直接共享;

我們使用記憶體表的時候,需要注意以下幾個方面:

1.伺服器記憶體足夠大;

2.我們建立的記憶體表和mysql內部臨時表有所不同:

記憶體表的資料存放在記憶體中,而內部臨時表(我們的query語句產生的)在恰當的時候存放在記憶體中,當內部臨時表變得很大時,mysql會自動地把它轉化為 在磁碟上儲存的表,而我們建立的記憶體表,卻不會自動轉換。

3.當我們單獨地delete from

某個記憶體表的時候,不會**記憶體;只有當整個表被delete的時候,才會**記憶體;

4.在mysql的主從伺服器上,記憶體表可以被複製

view code

(mysql官方文件,英文不好,參考的不多,英文還需繼續努力)

自己的實踐--mysql單機

可見執行insert into tblname select * from heaptbl;是可以將資料複製的。

實踐--mysql主備--結構:192.168.0.161:2000--192.168.0.161:2001

1

.在2000節點上建立記憶體資料庫testheap並插入資料

create table testheap(i

int) type=heap;

在2001節點上show tables是可以看到testheap的,並且是有資料的。

2.在2001節點上對錶testheap插入一些資料

在2000節點上select * from testheap;是可以看到新資料的。

記憶體表在主從備份結構中是可以被複製的。

Mysql之記憶體結構

mysql記憶體組成可以分為sga 系統全域性 和pga 程式快取區 引數用途 innodb buffer pool 用來快取innodb表的資料,索引,插入快取,資料字典等資訊 innodb log buffer 即redo log buffer 事務在記憶體中的緩衝 query cache 只能...

Mysql學習之記憶體詳解

本篇文章是對 mysql記憶體 的使用說明 全域性快取 執行緒快取 進行了詳細的分析介紹,需要的朋友參考下 首先我們來看乙個公式,mysql中記憶體分為全域性記憶體和執行緒記憶體兩大部分 其實並不全部,只是影響比較大的 部分 複製 如下 per thread buffers read buffer ...

leakcanary Android 之記憶體檢測

1,為什麼使用leakcanary。因為他簡單,方便,及時,易檢視。2,使用教程。leakcanary是自動檢測activity的,不用再任何activity裡新增 如果需要檢測fragment,那必須自己寫方法,使用它是refwatcher 具體用法如下 新增依賴 dependencies初始化物...