MySQL常用存储引擎之Memory
生活随笔
收集整理的這篇文章主要介紹了
MySQL常用存储引擎之Memory
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
看一下MYSQL存儲引擎的Memory存儲引擎,Memory存儲引擎也稱之為HEAP存儲引擎,從這個存儲引擎的名字中呢,可以知道,所有的數(shù)據(jù)都保存在內(nèi)存中的,這就意味著呢,這種存儲引擎表的數(shù)據(jù)呢,一旦MYSQL重啟,Memory存儲引擎表的數(shù)據(jù)呢,就會消失,但是表結(jié)構(gòu)就會保留下來,我們一會在演示時呢,就會看到,Memory存儲引擎的表,并不會存在磁盤數(shù)據(jù)文件,而只存在一個FRM文件,而這個frm文件呢,就是MYSQL服務(wù)器層記錄表結(jié)構(gòu)使用的文件,那就是為什么MYSQL服務(wù)器重啟后,Memory存儲引擎表中的數(shù)據(jù)會丟失,而表數(shù)據(jù)不會丟失的原因,因為表結(jié)構(gòu)是存在磁盤文件中的,而數(shù)據(jù)是保存在內(nèi)存中的,由于Memory存儲引擎的存儲特點呢,我們也知道另外一件事情就是,Memory存儲引擎的IO效率要比MYISAM高很多,因為MYISAM只有索引數(shù)據(jù),會保存在內(nèi)存中,而數(shù)據(jù)是由操作系統(tǒng)來緩存的,而Memory存儲的數(shù)據(jù)和索引呢,全都是在內(nèi)存中的,接下來我們先來看一看Memory存儲引擎的功能特點,再來給大家演示一下,這種存儲引擎的一種存儲方式
首先來看看他的功能特點,Memory存儲引擎支持兩種索引類型,也就是hash索引和BTree索引,如果在建立索引時呢,沒有指定索引類型時的話呢,默認(rèn)建立的是hash索引,由于hash索引的特點,如果是在做等值查詢的話呢,會非常的快,但是如果要做范圍查詢的話,就無法使用hash索引了,所以如果要使用memory存儲引擎的話,我們在建立索引的時候呢,先要了解我們的業(yè)務(wù)是如何使用存儲引擎的表的,如果絕大部分要使用等值查找的話,我們就可以使用hash索引,但是如果我們是范圍查找呢,那就要特別注意了,一定要使用B樹索引,使用錯誤的索引類型呢,是在Memory存儲引擎中,最常見的一種錯誤之一了,不正確的索引呢會對性能造成很大的影響,大家一定要注意
Memory存儲引擎的第二個特點呢,就是所有字段的存儲都是固定的長度,也就是說,就算是我們在定義表時,使用了varchar(10)這樣的字段類型,存儲時呢,同樣會轉(zhuǎn)成char(10),這樣固定長度字段的來進(jìn)行存儲,這就要求我們在定義表結(jié)構(gòu)時,一定要盡力使用符合要求的最小的字段長度,否則就會浪費大量的內(nèi)存,但是官方版本的MYSQL這個問題是一定存在的,Memory存儲引擎,定義表結(jié)構(gòu)時呢,還有一個很大的限制,不能使用text和blob大字段類型,同樣由于大字段類型呢會浪費很大的內(nèi)存空間,所以memory存儲引擎中呢是不能使用這種類型的
Memory存儲引擎的第四個特點呢,就是Memory存儲引擎所使用的表呢,他同樣是使用表級鎖的,所以盡管其所有數(shù)據(jù)和索引全部在內(nèi)存中,但是在一個繁忙的系統(tǒng)中,其性能也不見得比Innodb性能要好,一方面由于Innodb存儲引擎呢,也會把所有的數(shù)據(jù)和索引緩存在內(nèi)存中,如果我們訪問的是業(yè)務(wù)數(shù)據(jù)的話,也是直接從內(nèi)存中進(jìn)行讀取的,因為另一方面由于Innodb存儲引擎所使用的是行級鎖,而Memory所使用的是行級鎖,行級鎖比表級鎖要支持更大的并發(fā),所以吞吐量也會更高,如果使用memory存儲引擎呢,還有一點需要注意,就是memory表的最大大小呢參數(shù)max_heap_table_size來決定的,這個參數(shù)的默認(rèn)值只有16M,所以我們要在memory存儲引擎表中呢,存儲大量數(shù)據(jù)的話,需要修改這個參數(shù),而且這個參數(shù)的修改呢,是對于已經(jīng)存在的memory存儲引擎的表呢,是無效的,所以修改參數(shù)后,想對已經(jīng)存在的memory存儲引擎的表生效呢,就要對memory存儲引擎的表進(jìn)行重建,下面對存儲引擎的特點進(jìn)行演示,下面我們就 進(jìn)入到我們的演示系統(tǒng),給大家演示memory存儲引擎表使用的注意事項
首先我們還是要建立一個存儲引擎的表,按照我們之前的命名規(guī)則呢,把這個表命名為mymemory,他需要有幾列,一個是id列,一個是c1列,它是一個varchar列,c2列是一個char類型的列,在這里我們加入一個c3列,c3列是一個text類型,之前我們在介紹中我們說過,memory存儲引擎的表呢,是不支持大字段類型的,我們可以來看一看,如果我們加入了這么一個列呢,這個表是否能夠建立起來,大家看到這里出現(xiàn)了一個錯誤提示,提示的內(nèi)容已經(jīng)很明顯了,我們所使用的存儲引擎是不支持這種blob和text列的類型的create table mymemory(id int,c1 varchar(10),c2 char(10),c3 text)engine=memory;
那我們進(jìn)行一下修改,把c3列刪除之后,正確的語句就變成了這個,這個時候我們就建成了我們的memory存儲引擎的表create table mymemory(id int,c1 varchar(10),c2 char(10))engine=memory;
那首先呢我們先到我們的文件系統(tǒng)下,這個表的存儲方式是什么樣的,上面顯示了所有mymemory開頭的數(shù)據(jù)文件,大家看到這里只有 一個frm文件,所以這里也從另一點說明呢,memory存儲引擎的表呢,是不存在數(shù)據(jù)存儲文件的,而只有存儲表結(jié)構(gòu)的存儲文件,frm文件,下面我們來看看memory表的索引
在這里我們?yōu)閙ymemory兩個表建立索引,一個是在c1列上的索引,并不指定索引的類型
另外我么要在c2上建立索引,這個時候我們要指定我們使用的b樹索引create index idx_c1 on mymemory(c1);create index idx_c2 using btree on mymemory(c2);
我們來看看索引是不是和我們想象的一樣show index from mymemory\G
大家可以看到這個表上的兩個索引第一個是第一列上的索引,hash索引類型的,在第二列上的索引,由于我們指定了是b樹的索引,所以他的索引類型是b樹類型的索引
這就是我們剛才所講到的,存儲引擎支持的兩種索引類型,那么我們再來看一看表的狀態(tài)信息show create table mymemory\G
對于這個表的結(jié)構(gòu)呢,相對應(yīng)的索引信息是在這,我們只需要查看mymemory這個表就可以了show table status like 'mymemory\G'
大家可以看到,這里寫的行的類型是固定長度,從另一方面說明了就是說,memory存儲引擎中的表呢,所有列的長度都是固定的,其實我們之前定義了varchar長度的c2,但是他同樣會被轉(zhuǎn)換為固定長度,來進(jìn)行存儲,以上就是存儲引擎的使用方式,和他的存儲函數(shù)的一些特點
下面我們來看看memory存儲引擎中,有一個比較混淆的概念,就是memory存儲引擎表和臨時表,這兩個概念是非常容易讓人混淆的,臨時表可以分成兩種,一種是由查詢分析器,查詢優(yōu)化器列的查詢,所使用的一些表,也就是內(nèi)部臨時表,而另一種是使用create temporay table語句建立的臨時表,無論哪種臨時表,只有當(dāng)前session是可見的,Memory存儲引擎的表呢,所以memory存儲引擎的表并不是臨時表,另外對于系統(tǒng)使用的臨時表來說,有兩種情況,在限制以內(nèi)會使用Memory存儲引擎的表,而如果超過了限制呢,或者要使用text和blob這種大字段時呢,會使用myisam來建立臨時表,這就是我們剛才所說的兩種情況,如果系統(tǒng)使用了myisam的臨時表呢,這時的查詢性能就會受到影響,而對于create tempory table,語句建立的臨時表呢,是可以使用任何的存儲引擎的
那么經(jīng)過上面的分析和介紹呢,我們就知道了Memory存儲引擎,使用hash索引,對于等值查找是非常高效的,所以對于一些查找表和映射表呢,比如郵編和地區(qū)的對應(yīng)關(guān)系表,只會使用郵編這種等值查找,這種查詢就可以使用memory存儲引擎的查找,另外由于memory引擎的表是易失的,所以可以用于存儲一些中間結(jié)果,或者是做一些周期記錄聚合表的使用,不過無論哪種場景呢,要注意一點,memory存儲引擎的表呢,MYSQL重啟以后就會丟失,所以使用memory存儲引擎表的數(shù)據(jù)呢,一定是要可以再生的
有人可能有這樣的想法,使用主從復(fù)制,并且在主中使用memory引擎的表,而對于相同的表呢,在從DB中呢,使用其他引擎,InnoDB,或者M(jìn)YISAM,想以這樣的方式呢,來保證當(dāng)主DB重啟時,從DB中還有一份可用的數(shù)據(jù),但是如果真是這樣想的話,可能會法相實際情況不會像我們想象中的那樣,因為主DB在重啟時,會重建memroy引擎的表,所以從DB的表也會被重建,所以數(shù)據(jù)還是會丟失,這一點也是需要大家來注意的
?
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的MySQL常用存储引擎之Memory的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL常用存储引擎之Archive
- 下一篇: MySQL常用存储引擎之Federate