mysql的Memory引擎的深入了解

目錄

1、Memory引擎介紹

2、Memory內存結構

3、內存表的鎖

4、持久化

5、優缺點

6、應用


前言

????????Memory 存儲引擎?是 MySQL 中一種高性能但非持久化的存儲方案,適合臨時數據存儲緩存場景。其核心優勢在于極快的讀寫速度,需注意數據丟失風險內存占用限制

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


1、Memory引擎介紹

????????MySQL Memory引擎用于創建內存中的表,數據存儲在內存,訪問快速但重啟后數據丟失。通過--init-file啟動mysqld可持久化數據。

????????內存表默認使用hash索引,適用于臨時表,但有限制如不支持BLOB/TEXT,且所有用戶可見。可以利用其速度優勢創建內存臨時表替代MyISAM臨時表。

  • 數據完全存儲在內存中
    • 數據和索引均存在于內存中,無磁盤 I/O 開銷。
    • 重啟 MySQL 或異常關閉后,數據會丟失。
  • 存儲限制
    • 受?max_heap_table_size?和?tmp_table_size?參數限制。
    • 不支持大字段(如?TEXTBLOB)。
  • 存儲結構
    • 僅支持哈希索引,適合等值查詢(=),不支持范圍查詢(><BETWEEN)。
  • 不支持事務

2、Memory內存結構

????僅支持哈希索引,數據存放將索引和數據分開存儲。

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

如下圖所示:

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

3、內存表的鎖

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

示例:

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

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


4、持久化

如果數據庫重啟,所有的內存表都會被清空。

在主備場景:

看一下下面這個時序:

  1. 業務正常訪問主庫。
  2. 備庫硬件升級, 備庫重啟, 內存表t1內容被清空。
  3. 備庫重啟后, 客戶端發送一條update語句, 修改表t1的數據行, 這時備庫應用線程就會報錯“找不到要更新的行”。

??注意:內存表可能導致主備不一致。

?解決方案:

????????所以, 擔心主庫重啟之后, 出現主備不一致, MySQL在實現上做了這樣一件事兒: 在數據庫重啟之后, 往binlog里面寫入一行DELETE FROM t1。

????????在備庫重啟的時候, 備庫binlog里的delete語句就會傳到主庫, 然后把主庫內存表的內容刪除。這樣使用的時候就會發現, 主庫的內存表數據突然被清空了。

無論是M-S架構,還是雙M架構,內存表都不適合在生產環境上作為普通數據表使用。


5、優缺點


6、應用

設置:

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

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

-- 創建表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);-- 執行查詢語句,得到結果如下圖:
select * from t1;
select * from t2;

結果如下:

內存表t1的返回結果里面0在最后一行, 而InnoDB表t2的返回結果里0在第一行。

????????表t1是Memory表,而Memory表的數據和索引是分開的。

數據組織方式如下:

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

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

????????表t2是InnoDB表,其數據就放在主鍵索引樹上,主鍵索引是B+樹。

數據組織方式如下:

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


關于三種不同引擎的總結


參考文章:

1、MySQL查詢執行(八):Memory引擎_mysql memory引擎-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82910.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82910.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82910.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

若依項目AI 助手代碼解析

基于 Vue.js 和 Element UI 的 AI 助手組件 一、組件整體結構 這個 AI 助手組件由三部分組成&#xff1a; 懸浮按鈕&#xff1a;點擊后展開 / 收起對話窗口對話窗口&#xff1a;顯示歷史消息和輸入框API 調用邏輯&#xff1a;與 AI 服務通信并處理響應 <template><…

Vue2的diff算法

diff算法的目的是為了找出需要更新的節點&#xff0c;而未變化的節點則可以復用 新舊列表的頭尾先互相比較。未找到可復用則開始遍歷&#xff0c;對比過程中指針逐漸向列表中間靠攏&#xff0c;直到遍歷完其中一個列表 具體策略如下&#xff1a; 同層級比較 Vue2的diff算法只…

mongodb集群之分片集群

目錄 1. 適用場景2. 集群搭建如何搭建搭建實例Linux搭建實例(待定)Windows搭建實例1.資源規劃2. 配置conf文件3. 按順序啟動不同角色的mongodb實例4. 初始化config、shard集群信息5. 通過router進行分片配置 1. 適用場景 數據量大影響性能 數據量大概達到千萬級或億級的時候&…

DEEPSEEK幫寫的STM32消息流函數,直接可用.已經測試

#include "main.h" #include "MessageBuffer.h"static RingBuffer msgQueue {0};// 初始化隊列 void InitQueue(void) {msgQueue.head 0;msgQueue.tail 0;msgQueue.count 0; }// 檢查隊列狀態 type_usart_queue_status GetQueueStatus(void) {if (msgQ…

華為歐拉系統中部署FTP服務與Filestash應用:實現高效文件管理和共享

華為歐拉系統中部署FTP服務與Filestash應用:實現高效文件管理和共享 前言一、相關服務介紹1.1 Huawei Cloud EulerOS介紹1.2 Filestash介紹1.3 華為云Flexus應用服務器L實例介紹二、本次實踐介紹2.1 本次實踐介紹2.2 本次環境規劃三、檢查云服務器環境3.1 登錄華為云3.2 SSH遠…

React---day5

4、React的組件化 組件的分類&#xff1a; 根據組件的定義方式&#xff0c;可以分為&#xff1a;函數組件(Functional Component )和類組件(Class Component)&#xff1b;根據組件內部是否有狀態需要維護&#xff0c;可以分成&#xff1a;無狀態組件(Stateless Component )和…

測試策略:AI模型接口的單元測試與穩定性測試

測試策略:AI模型接口的單元測試與穩定性測試 在構建支持AI能力的系統中,開發者不僅要關注業務邏輯的正確性,也必須保障AI模型接口在各種環境下都能穩定運行。這就要求我們在開發階段制定清晰的測試策略,從功能驗證到性能保障,逐步推進系統可用性、可維護性與可擴展性的提…

UniApp 生產批次管理模塊技術文檔

UniApp 生產批次管理模塊技術文檔 1. 運行卡入站頁面 (RunCardIn) 1.1 頁面結構 <template><!-- 頁面容器 --><view class"runCardIn" :style"{ paddingTop: padding }"><!-- 頁頭組件 --><pageHeader :title"$t(MENU:…

針對Helsinki-NLP/opus-mt-zh-en模型進行雙向互翻的微調

引言 ?題目聽起來有點怪怪的&#xff0c;但是實際上就是對Helsinki-NLP/opus-mt-en-es模型進行微調。但是這個模型是單向的&#xff0c;只支持中到英的翻譯&#xff0c;反之則不行。這樣的話&#xff0c;如果要做中英雙向互翻就需要兩個模型&#xff0c;那模型體積直接大了兩倍…

Object轉Map集合

對象與 Map 轉換詳解&#xff1a; Object.entries() 和 Object.fromEntries() 1&#xff0c;Object.fromEntries() 的主要用途就是將鍵值對集合&#xff08;如 Map&#xff09;轉換為普通對象。 2&#xff0c;Object.entries() 返回一個二維數組&#xff0c;其中每個子數組包…

優先隊列用法

第 5 行定義了一個隊首是最大值的優先隊列,第 10 行的輸出如下: 27 - wuhan 21 - shanghai 11 - beijing 第 13 行定義了一個隊首是最小值的優先隊列,第 19 行的輸出如下: 11 - beijing 21 - shanghai 27 - wuhan #include <bits/stdc.h> using namespace std; int…

Spring Boot3.4.1 集成redis

Spring Boot3.4.1 集成redis 第一步 引入依賴 <!-- redis 緩存操作 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- pool 對象池 …

Replacing iptables with eBPF in Kubernetes with Cilium

source: https://archive.fosdem.org/2020/schedule/event/replacing_iptables_with_ebpf/attachments/slides/3622/export/events/attachments/replacing_iptables_with_ebpf/slides/3622/Cilium_FOSDEM_2020.pdf 使用Cilium&#xff0c;結合eBPF、Envoy、Istio和Hubble等技術…

英一真題閱讀單詞筆記 05年

2005 年 Text 1 第一段 序號 單詞 音標 詞義 1 fat [ft] a. 豐厚的&#xff0c;巨額的&#xff1b;肥胖的 2 pay [pe?] n. 薪水 3 rise [ra?z] n. 上漲&#xff0c;增加&#xff1b;斜坡 4 pleasure [ple??(r)] n. 快樂&#xff1b;樂事 5 pleasure a…

FastAPI集成APsecheduler的BackgroundScheduler+mongodb(精簡)

項目架構&#xff1a; FastAPI(folder) >app(folder) >core(folder) >models(folder) >routers(folder) >utils(folder) main.py(file) 1 utils文件夾下新建schedulers.py from apscheduler.schedulers.background import BackgroundScheduler from apschedu…

聊一聊接口測試中耗時請求如何合理安排?

目錄 一、異步處理與輪詢機制 輪詢檢查機制 二、 并行化測試執行 三、模擬與樁技術&#xff08;Mock/Stub&#xff09; 四、動態超時與重試策略 五、測試架構設計優化 分層測試策略 并行化執行 網絡優化 六、測試用例分層管理 金字塔策略 七、 緩存與數據復用 響應…

深入詳解DICOMweb:WADO與STOW-RS的技術解析與實現

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

Splunk Validated Architecture (SVA):構建企業級可觀測性與安全的基石

Splunk Validated Architecture (SVA) 是 Splunk 官方提供的一套經過嚴格測試、性能驗證和最佳實踐指導的參考架構藍圖。它并非單一固定方案&#xff0c;而是根據企業數據規模、性能需求、高可用性目標和合規要求&#xff0c;提供一系列可落地的部署模型。SVA 的核心價值在于為…

Armv7l或樹莓派32位RPI 4B編譯faiss

pip3 install faiss-cpu當然找不到預編譯的包 手動下載 git clone https://github.com/facebookresearch/faiss.git cd faiss #能需要切換到特定版本標簽&#xff0c;例如 v1.7.1&#xff0c;這個版本Cmake 3.18可以過&#xff0c;因為apt install安裝的cmake只更新到這里&am…

C++之string的模擬實現

string 手寫C字符串類類的基本結構與成員變量一、構造函數與析構函數二、賦值運算符重載三、迭代器支持四、內存管理與擴容機制五、字符串操作函數六、運算符重載總結 手寫C字符串類 從零實現一個簡易版std::string 類的基本結構與成員變量 namespace zzh { class string { …