最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL的memory存儲引擎詳解

 更新時間:2025年06月30日 09:59:34   作者:找不到、了  
這篇文章主要介紹了MySQL的memory存儲引擎,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Memory 存儲引擎是 MySQL 中一種高性能但非持久化的存儲方案,適合臨時數(shù)據(jù)存儲緩存場景。其核心優(yōu)勢在于極快的讀寫速度,需注意數(shù)據(jù)丟失風(fēng)險內(nèi)存占用限制。

在使用時需結(jié)合業(yè)務(wù)需求,合理配置參數(shù)(如max_heap_table_size),并避免將其用于需要持久化或事務(wù)支持的場景。

1、Memory引擎介紹

MySQL Memory引擎用于創(chuàng)建內(nèi)存中的表,數(shù)據(jù)存儲在內(nèi)存,訪問快速但重啟后數(shù)據(jù)丟失。通過--init-file啟動mysqld可持久化數(shù)據(jù)。

內(nèi)存表默認使用hash索引,適用于臨時表,但有限制如不支持BLOB/TEXT,且所有用戶可見??梢岳闷渌俣葍?yōu)勢創(chuàng)建內(nèi)存臨時表替代MyISAM臨時表。

數(shù)據(jù)完全存儲在內(nèi)存中

  • 數(shù)據(jù)和索引均存在于內(nèi)存中,無磁盤 I/O 開銷。
  • 重啟 MySQL 或異常關(guān)閉后,數(shù)據(jù)會丟失。

存儲限制

  • 受max_heap_table_size和tmp_table_size參數(shù)限制。
  • 不支持大字段(如TEXT、BLOB)。

存儲結(jié)構(gòu)

  • 僅支持哈希索引,適合等值查詢(=),不支持范圍查詢(><、BETWEEN)。
  • 不支持事務(wù)

2、Memory內(nèi)存結(jié)構(gòu)

僅支持哈希索引,數(shù)據(jù)存放將索引和數(shù)據(jù)分開存儲。

索引采用Hash的形式,存放主鍵id和指向數(shù)據(jù)的指針,而數(shù)據(jù)則按插入順序存放。稱這種數(shù)據(jù)組織方式為堆組織方式。

如下圖所示:

特點:且數(shù)據(jù)的hash的key也不支持有序,value也沒指定的順序。

3、內(nèi)存表的鎖

內(nèi)存表不支持行鎖,只支持表鎖。如果一張表有更新,就會堵住其它所有在這個表上的讀寫操作。導(dǎo)致了Memory存儲引擎在進行并發(fā)操作時會造成大量的阻塞,效率不高。

示例:

在這個執(zhí)行序列里, session A的update語句要執(zhí)行50秒, 在這個語句執(zhí)行期間session B的查詢會進入鎖等待狀態(tài)。 session C的show processlist 結(jié)果輸出如下:

跟行鎖比起來, 表鎖對并發(fā)訪問的支持不夠好。

4、持久化

如果數(shù)據(jù)庫重啟,所有的內(nèi)存表都會被清空。

在主備場景:

看一下下面這個時序:

  • 業(yè)務(wù)正常訪問主庫。
  • 備庫硬件升級, 備庫重啟, 內(nèi)存表t1內(nèi)容被清空。
  • 備庫重啟后, 客戶端發(fā)送一條update語句, 修改表t1的數(shù)據(jù)行, 這時備庫應(yīng)用線程就會報錯“找不到要更新的行”。

??注意:內(nèi)存表可能導(dǎo)致主備不一致。

解決方案:

所以, 擔(dān)心主庫重啟之后, 出現(xiàn)主備不一致, MySQL在實現(xiàn)上做了這樣一件事兒: 在數(shù)據(jù)庫重啟之后, 往binlog里面寫入一行DELETE FROM t1。

在備庫重啟的時候, 備庫binlog里的delete語句就會傳到主庫, 然后把主庫內(nèi)存表的內(nèi)容刪除。這樣使用的時候就會發(fā)現(xiàn), 主庫的內(nèi)存表數(shù)據(jù)突然被清空了。

無論是M-S架構(gòu),還是雙M架構(gòu),內(nèi)存表都不適合在生產(chǎn)環(huán)境上作為普通數(shù)據(jù)表使用。

5、優(yōu)缺點

6、應(yīng)用

設(shè)置:

set sql_log_bin=off;
alter table tbl_name engine=innodb;

假設(shè)有以下兩張表t1、t2,其中表t1是Memory引擎,表t2是InnoDB引擎。

-- 創(chuàng)建表t1,t2,分別使用Memory引擎和InnoDB引擎;
create table t1(id int primary key,c int) engine=Memory;
create table t2(id int primary key,c int) engine=innodb;
insert into t1values(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0);
insert into t2values(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0);
 
-- 執(zhí)行查詢語句,得到結(jié)果如下圖:
select * from t1;
select * from t2;

結(jié)果如下:

根據(jù)圖示可知:

內(nèi)存表t1的返回結(jié)果里面0在最后一行, 而InnoDB表t2的返回結(jié)果里0在第一行。

表t1是Memory表,而Memory表的數(shù)據(jù)和索引是分開的。

數(shù)據(jù)組織方式如下:

由上可知,內(nèi)存表的數(shù)據(jù)部分以數(shù)組的方式單獨存放,而主鍵id索引里,存的是每個數(shù)據(jù)的位置。主鍵id是hash索引,可以看到索引上的key并不是有序的。

在對表t1執(zhí)行select *的時候, 走的是全表掃描, 也就是順序掃描這個數(shù)組。 因此, 0就是最后一個被讀到, 并放入結(jié)果集的數(shù)據(jù)。

表t2是InnoDB表,其數(shù)據(jù)就放在主鍵索引樹上,主鍵索引是B+樹。

數(shù)據(jù)組織方式如下:

主鍵索引上的值是有序存儲的,在執(zhí)行select *的時候, 就會按照葉子節(jié)點從左到右掃描, 所以得到的結(jié)果里, 0就出現(xiàn)在第一行。

關(guān)于三種不同引擎的總結(jié)

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文帶你理解MySQL?TCL?事務(wù)控制

    一文帶你理解MySQL?TCL?事務(wù)控制

    本文主要介紹了MySQL?TCL事務(wù)控制,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • MySQL replace函數(shù)替換字符串語句的用法

    MySQL replace函數(shù)替換字符串語句的用法

    MySQL replace函數(shù)我們經(jīng)常用到,下面就為您詳細介紹MySQL replace函數(shù)的用法,希望對您學(xué)習(xí)MySQL replace函數(shù)方面能有所啟迪。
    2010-12-12
  • mysql如何查看binlog日志

    mysql如何查看binlog日志

    該文章介紹了如何在MySQL中使用命令來查詢?nèi)罩緺顟B(tài)、獲取binlog文件列表、查看特定binlog文件內(nèi)容等,通過這些命令,用戶可以了解當(dāng)前MySQL日志的狀態(tài),查看binlog文件的具體內(nèi)容等
    2026-05-05
  • mysql的union和union all用法詳解

    mysql的union和union all用法詳解

    union 和 union all 的區(qū)別是,union 會自動壓縮多個結(jié)果集合中的重復(fù)結(jié)果,而 union all 則將所有的結(jié)果全部顯示出來,不管是不是重復(fù),本文給大家介紹mysql的union和union all用法,感興趣的朋友一起看看吧
    2023-08-08
  • 微信公眾平臺開發(fā) 數(shù)據(jù)庫操作

    微信公眾平臺開發(fā) 數(shù)據(jù)庫操作

    這篇文章主要介紹了微信公眾平臺開發(fā) 數(shù)據(jù)庫操作的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • MySQL存儲結(jié)構(gòu)用法案例分析

    MySQL存儲結(jié)構(gòu)用法案例分析

    這篇文章主要介紹了MySQL存儲結(jié)構(gòu)用法,結(jié)合具體案例形式分析了mysql存儲結(jié)構(gòu)相關(guān)使用方法與操作注意事項,需要的朋友可以參考下
    2018-07-07
  • MYSQL的存儲過程和函數(shù)簡單寫法

    MYSQL的存儲過程和函數(shù)簡單寫法

    簡單的說,就是一組SQL語句集,功能強大,可以實現(xiàn)一些比較復(fù)雜的邏輯功能,類似于JAVA語言中的方法,這里就為大家簡單介紹一下,需要的朋友可以參考下
    2018-05-05
  • MySQL中處理各種重復(fù)的一些方法

    MySQL中處理各種重復(fù)的一些方法

    這篇文章主要介紹了MySQL中處理各種重復(fù)的一些方法,包括對表和查詢結(jié)果的重復(fù)的一些處理,需要的朋友可以參考下
    2015-05-05
  • 手動配置phpmyadmin和mysql密碼的兩種方案

    手動配置phpmyadmin和mysql密碼的兩種方案

    這篇文章主要介紹了手動配置phpmyadmin和mysql密碼的兩種方案,需要的朋友可以參考下
    2014-03-03
  • MySQL中查詢?nèi)罩九c慢查詢?nèi)罩镜幕緦W(xué)習(xí)教程

    MySQL中查詢?nèi)罩九c慢查詢?nèi)罩镜幕緦W(xué)習(xí)教程

    這篇文章主要介紹了MySQL中查詢?nèi)罩九c慢查詢?nèi)罩镜幕緦W(xué)習(xí)教程,文中還提到了MySQL自帶的Mysqldumpslow日志分析工具的使用,需要的朋友可以參考下
    2015-12-12

最新評論

泽普县| 宝丰县| 抚宁县| 安康市| 寻甸| 永城市| 皮山县| 镇江市| 微山县| 内江市| 孟津县| 浮梁县| 永善县| 得荣县| 陆河县| 台州市| 沅江市| 彭州市| 延长县| 武鸣县| 怀安县| 通海县| 曲水县| 万宁市| 石楼县| 临澧县| 浦江县| 织金县| 马边| 拜泉县| 自贡市| 梧州市| 常宁市| SHOW| 沐川县| 阿图什市| 万全县| 如皋市| 陵水| 怀柔区| 昌宁县|