mysql 記憶體表使用總結

2021-07-11 09:21:44 字數 2920 閱讀 7022

部分**:  

1、記憶體表使用雜湊雜湊索引把資料儲存在記憶體中,因此具有極快的速度,適合快取中小型資料庫,但是使用上受到一些限制

定義:create table (...)  engine = memory/heap ;  (一般使用memory,heap用得少了)

用法: 

①、記憶體表的資料是使用hash的方式儲存在記憶體上,故其查詢的時候只支援 <> 和 = 這兩種比較方式;

②、記憶體表的資料可以對所有使用者的連線可見,但是其不能跨伺服器重啟; 伺服器重啟後,記憶體表中的所有資料都將丟失,但是表結構還在,因為表結構是儲存在磁碟中;

③、記憶體表的資料在max_heap_table_size這裡設定,若單張錶行數超過了這個長度,則報資料滿錯誤 ; 我電腦裡的mysql本引數預設值是16777216 ;

④、記憶體表不支援事務,而且是表鎖,當修改頻繁時,效能會下降

⑤、記憶體表使用乙個固定的記錄長度格式,一般來說不要用varchar型別,如果使用了它會以varchar的最大長度來申請記憶體。記憶體表不支援blob或text型別

⑥、記憶體表不支援auto_increment 《我的新版的mysql測試時支援 自增列的》;只允許對非空資料列進行索引(not null)

⑦、如果heap是複製的某資料表,則複製之後所有主鍵、索引、自增等格式將不復存在,需要重新新增主鍵和索引,如果需要的話。

首先,我們來說一下什麼是記憶體表,所謂記憶體表,是指整個資料庫表都常駐在記憶體中的表,相對於普通表而言,記憶體表儲存資料在記憶體中,而普通表儲存在硬碟中。那麼記憶體表到底有什麼特點呢?下面我們來詳細地分析一下。

1.mysql記憶體表要怎樣建立呢?

首先,我們先來學習一下到底要怎樣建立乙個記憶體表呢?方法很簡單,就跟普通表差不多,唯一的差異是,記憶體表所使用的資料庫引擎是記憶體。如下:?

1

2

3

4

5

createtable`test` (

`id`char(5)notnull,

`username`varchar(15)collateutf8_unicode_cidefaultnull,

primarykey(`id`)

) engine=memorydefaultcharset=utf8collate=utf8_unicode_ci;

我們普通表的引擎一般是innodb,我們要使用記憶體表,就必須把引擎設定成memory。記憶體表的結構存放在磁碟上,擴充套件名為.frm, 所以重啟不會丟失。但是資料是儲存在記憶體當中,所以重啟之後,表資料會全部丟失。

2.mysql記憶體表到底有什麼限制?

如果你平時設計資料庫表的時候,有喜歡使用varchar型別的習慣的話,那麼,你使用記憶體表的時候,就需要注意到乙個細節了。我們都知道,在使用記憶體之前,都要先申請一段記憶體,那麼也就是說,記憶體表在建立之後,每一行要使用的記憶體就已經固定下來了,但是我們都知道,varchar型別是動態可變長度,只有乙個上限值,那麼記憶體表會怎麼做呢,先看下面乙個例子:

以上面的表為例,假如有這麼兩條記錄:

10000,'hellowrold!'

10001,'hey!'

普通表占用空間 -> 

10000,'hellowrold!'+

10001,'hey!'

記憶體表占用空間 -> 10000,'hellowrold!    '+

10001,'hey!          '

從上面的對比我們可以知道,記憶體表中如果使用了varchar型別,那麼表建立的時候,會以varchar最大的長度來申請記憶體,這樣,如果我們如果設計長度不合理的時候,就會造成記憶體浪費。並且記憶體表不支援blob或text型別,這個不支援的原因也可以理解了。

記憶體表不支援事務,因為

記憶體表是表鎖,所以當修改頻繁時會影響表的效能。

再者,是表大小的問題,記憶體表到底能有多大?理論上說,只要你記憶體足夠大,表就可以有多大,但是預設記憶體表預設的大小是64mb(如果我沒有記錯的話),如果我們要設定成自己想要的大小,我們需要在my.cnf檔案中修改max_heap_table_size引數,修改完成後,要重啟mysql才會生效。如果我們的表滿了以後,mysql並不會把資料儲存到硬碟中,而是直接報表已經滿了的錯誤。

3.我們使用記憶體表的時候還需要注意些什麼操作?

我之前用100gb的記憶體做了測試,建了35張表,其中有一張表插入了大概30gb左右的資料,其他34張表平均不到1gb的資料,然後我嘗試在30gb的表裡面做了turncate操作,卡了一段時間之後,操作成功,但其他34張表也受到了影響,資料竟然全部不見了!於是我又繼續插入上次的資料,再對34張表中的其中任意一張表做turncate操作,這次竟然沒有影響,我猜測可能是記憶體占用過大的話,會有什麼不可預料的事情發生吧,這一切發生在rhel,具體什麼原因也不太清楚了。

後來我嘗試使用delete、update語句可以正常使用,不過由於是表鎖機制,所以我們在實際使用過程中,也要注意操作表的先後順序,保證讀或者寫的時候,沒有其他連線操作把錶鎖住了,不然你會發現你的操作會失敗,並且mysql不會告訴你表已經鎖了,這個時候就只能靠自己的直覺去判斷是不是表鎖了。

好吧,暫時就這麼多了,如果有什麼不對的地方歡迎指正、**。周一要吼一吼,才有氣勢,至少可以把紅薯鎮住,嗷~~~~~

mysql記憶體表heap使用總結

記憶體表使用雜湊雜湊索引把資料儲存在記憶體中,因此具有極快的速度,適合快取中小型資料庫,但是使用上受到一些限制,以下是藍草使用的一些感受。1 heap對所有使用者的連線是可見的,這使得它非常適合做快取。2 僅適合使用的場合。heap不允許使用 text和 blob資料型別 只允許使用 和 操作符來搜...

mysql記憶體表heap使用總結

記憶體表使用雜湊雜湊索引把資料儲存在記憶體中,因此具有極快的速度,適合快取中小型資料庫,但是使用上受到一些限制,以下是藍草使用的一些感受。1 heap對所有使用者的連線是可見的,這使得它非常適合做快取。2 僅適合使用的場合。heap不允許使用 text和 blob資料型別 只允許使用 和 操作符來搜...

mysql記憶體表 MySQL的記憶體表

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