mysql之內存表


一、引言

昨天下午老大讓我查資料看一下mysql的內存表在主從備份中是否能被復制,我還沒聽說過內存表呢,於是上網查資料,記錄一下,以便查閱、學習

二、進展

參考:

http://www.cnblogs.com/sunss/p/3191137.html

內存表:
復制代碼
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

http://www.cnblogs.com/sunss/archive/2011/03/16/1986050.html

  “內存表”顧名思義創建在內存中的表,真是這樣嗎?其實不然,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

http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html (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;是可以看到新數據的。

三、結論

內存表在主從備份結構中是可以被復制的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM