MySQL體系架構解析(四):MySQL數據存儲的揭秘

MySQL中的數據目錄

確定MySQL的數據目錄

到底MySQL把數據都存到哪個路徑下呢?其實數據木對應著一個系統變量datadir,我們在使用客戶端與服務器建立連接之后查看這個系統變量的值就可以了。

-- 以下兩種方式都可以
show variables like 'datadir';
select @@datadir;

當然這個目錄可以通過配置文件進行修改,由我們自己指定。

數據目錄都放些什么?

MySOL在運行過程中都會產生哪些數據呢?當然會包含我們創建的數據庫、表、視圖和觸發器等用戶數據,除了這些用戶數據,為了程序更好地運行,MySQL也會創建一些其他的額外數據。

數據庫在文件系統的中表示

create database lijin charset=utf8;

在這里插入圖片描述

每當我們使用create database語句從創建一個數據庫時,在文件系統上實際發生了什么呢?其實很簡單,每個數據庫都對應數據目錄下的一個子目錄,或者說對應一個文件夾,我們每當新建一個數據庫時,MySQL會幫我們做這兩件事兒:

  1. 在數據目錄下創建一個和數據庫名同名的子目錄(或者文件夾)
  2. 在該與數據庫名同名的子目錄下創建一個名為db.opt的文件,該文件中包含了該數據庫的各種屬性,比方說該數據的字符集和比較規則等。

在這里插入圖片描述
比方說我們查看一下在我的計算機上當前有哪些數據庫︰
在這里插入圖片描述
可以看到在當前有5個數據庫,其中 linjin 數據庫是我們自定義的,其余4個數據庫是屬于MySQL自帶的系統數據庫。我們再看一下數據目錄下的內容:
在這里插入圖片描述
在這里插入圖片描述
當然這個數據目錄下的文件和子目錄比較多,但是如果仔細看的話,除了information_schema這個系統數據庫外,其他的數據庫在數居目錄下都有對應的子目錄。這個information_schema比較特殊,我們后面再講它的作用。

數據表在文件系統中的表示

我們的數據其實都是以記錄的形式插入到表中的,每個表的信息其實可以分為兩種。

  • 表結構的定義
  • 表中的數據

表結構就是該表的名稱是啥,表里邊有多少列,每個列的數據類型是啥,有啥約束條件和索引,用的啥字符集和比較規則各種信息,這些信息都體現在了我們的見表語句中了。為了保存這些信息,InnoDB 和 MyISAM 這兩種哪個存儲引擎都在數據目錄下對應的數據庫子目錄下創建了一個專門用于描述表結構的文件,文件名是這樣:tableName.frm。

比方說我們在lijin數據庫下創建一個名為test的表
在這里插入圖片描述
那在數據庫 lijin 對應的子目錄下就會創建一個名為test.frm的用于描述表結構的文件。這個后綴名為.fm是以二進制格式存儲的。
在這里插入圖片描述
那表中的數據存到什么文件中了呢?不同的存儲引擎就有所不同,下邊我們分別看了下 InnoDB 和 MyISAM 是用什么文件來保存表中數據的。

InnoDB是如何存儲表數據

InnoDB 的數據會放在一個表空間或者文件空間(英文名: table space 或者 file space )的概念,這個表空間是一個抽象的概念,它可以對應文件系統上一個或多個真實文件〈不同表空間對應的文件數量可能不同)。每一個表空間可以被劃分為很多很多很多個頁,我們的表數據就存放在某個表空間下的某些頁里。表空間有好幾種類型。

系統表空間(system tablespace)
這個所謂的系統表空間可以對應文件系統上一個或多個實際的文件,默認情況下,InnoDB 會在數據目錄下創建一個名為 ibdata1 (在你的數據目錄下找找看有木有)、大小為12M的文件,這個文件就是對應的系納表空間在文件系統上的表示。
在這里插入圖片描述
這個文件是所謂的自擴展文件,也就是當不夠用的時候它會自己增加文件大小,當然,如果你想讓系統表空間對應文件系統上多個實際文件,或者僅僅覺得原來的 ibdata1 這個文件名難聽,那可以在 MySQL 啟動時配置對應的文件路徑以及它們的大小,我們也可以把系統表空間對應的文件路徑不配置到數據目錄下,甚至可以配置到單獨的磁盤分區上。

需要注意的一點是,在一個MySQL服務器中,系統表空間只有一份。從MySQL5.5.7到MySQL5.6.6之間的各個版本中,我們表中的數據都會被默認存儲到這個系統表空間。

獨立表空間(file-per-table tablespace)
在 MySQL5.6.6 以及之后的版本中,InnoB 并不會默認的把各個表的數據存儲到系統表空間中,而是為每一個表建立一個獨立表空間,也就是說我們創建了多少個表,就有多少個獨立表空間。使用獨立表空間來存儲表數據的話,會在該表所屬數據庫對應的子目錄下創建一個表示該獨立表空間的文件,文件名和表名相同,只不過添加了一個. ibd 的擴展名而已,所以完整的文件名稱長這樣:tableName.ibd

比方說假如我們使用了獨立表空間去存儲lijin數據庫下的test表的話,那么在該表所在數據庫對應的lijin目錄下會為test表創建這兩個文件:
test.frm和test.ibd
在這里插入圖片描述
其中test.ibd文件就用來存儲test表中的數據和索引,.frm 格式的文件前面已經說過,這里就不再贅述了。當然我們也可以自己指定使用系統表空間還是獨立表空間來存儲數據,這個功能由啟動參數
innodb_file_per_table 控制,比如說我們想刻意將表數據都存儲到系統表空間時,可以在啟動MySQL服務器的時候這樣配置:

[server]
innodb_file_per_table=0

  • innodb_file_per table的值為0時,代表使用系統表空間;
  • innodb_file_per table的值為1時,代表使用獨立表空間。

不過inmodb_file_per_table參數只對新建的表起作用,對于已經分配了表空間的表并不起作用。

其他類型的表空間
隨著 MySQL 的發展,除了上述兩種老牌表空間之外,現在還新提出了一些不同類型的表空間,比如通用表空間(general tablespace) 、undo表空間(undotablespace)、臨時表空間〈temporary tablespace)等。

MyISAM是如何存儲表數據的

在 MyISAM 中的數據和索引是分開存放的。所以在文件系統中也是使用不同的文件來存儲數據文件和索引文件。而且和 InnoDB 不同的是,MyISA 并沒有什么所謂的表空間一說,表數據都存放到對應的數據庫子目錄下。
在這里插入圖片描述
test_myisam 表使用 MyISAM 存儲引擎的話,那么在它所在數據庫對應的 lijin 目錄下會為 MyISAM表創建三個文件:
在這里插入圖片描述
其中 test_myisam.MYD 代表表的數據文件,也就是我們插入的用戶記錄; test_myisam.MYI 代表表的索引文件,我們為該表創建的索引都會放到這個文件中。

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

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

相關文章

Solidity從入門到精通-Remix的基本使用和Solidity的基本數據類型

Solidity從入門到精通-Remix的基本使用和Solidity的基本數據類型 講了那么多理論,相信大家對區塊鏈/web3也有了一定認知;這時候可能就問有人會問了如何把理論變成實際的代碼實現。 這就來了接下來會給大家分享Solidity入門教程 這時候就會有同學問了Sol…

ArcGIS Pro+ArcGIS給你的地圖加上北回歸線!

今天來看ArcGIS Pro和ArcGIS中如何給制作的中國地圖或者其他大范圍地圖加上北回歸線。 我們將在ArcGIS Pro和ArcGIS中一同介紹。 1 ArcGIS Pro中設置北回歸線 1、在ArcGIS Pro中初步設置好經緯格網等,設置經線、緯線都以10間隔顯示。 2、需要插入背會歸線&#xf…

在.NET Core控制器中獲取AJAX傳遞的Body參數

.Net Core是支持前后端不分離式的開發的,如果在原始系統中采用不分離式開發,后面需要在原系統中增加功能,并且新的服務采用其他語言開發,且系統原來功能保持原樣,這樣前端系統可以單獨調用新開發的接口。 但是&#x…

ubuntu24安裝opencv過程

1.訪問opencv官網,下載源代碼。 opencv 2.選擇相應版本的源碼下載 我這里用的是4.8.1版本的源碼進行安裝,opencv-4.8.1.tar.gz 安裝命令 tar xvf opencv-4.8.1.tar.gz #在當前文件夾創建build文件,并進入 mkdir build && cd build …

Kubernetes ClusterIP 端口深度解析:虛擬服務與流量轉發機制

事情的起因是創建了一個 NodePort 類型 Service,其端口映射關系為 8000:30948/TCP。既然30948是在每個node開的端口,那8000是開在哪的呢?出于好奇回顧了一下K8s的Cluster IP和Service 端口映射關系解析 在 Kubernetes 的 NodePort Service 中…

C++左值與右值及引用的總結

前言 在C中,理解左值(lvalue)和右值(rvalue)是掌握現代C核心特性的關鍵。左值通常指代具名的、持久存在的對象,可以取地址;而右值則是臨時的、即將銷毀的值,如字面量或表達式結果。…

學習記錄:DAY31

Java課設:數字水印處理與解析器開發 前言 想養成寫日記的習慣真不容易。最近比較懶散,復習不想復,項目又做完了,處于一種能干些什么,但是不太想干,但是不干些什么又渾身難受的處境。其實完全就不是勻不出…

Linux系統部署KES

1、安裝準備 1.版本說明V008R006C009B0014 V008:是version產品的大版本。 R006:是release產品特性版本。 C009:是通用版 B0014:是build開發過程中的構建版本2.硬件要求 #安全版和企業版 內存:1GB 以上 硬盤&#xf…

系統模塊與功能設計框架

系統模塊與功能設計框架,嚴格遵循專業架構設計原則,基于行業標準(如微服務架構、DDD領域驅動設計)構建。設計采用分層解耦模式,確保可擴展性和可維護性,適用于電商、企業服務、數字平臺等中大型系統。 系統…

MySQL中【正則表達式】用法

MySQL 中正則表達式通過 REGEXP 或 RLIKE 操作符實現(兩者等價),用于在 WHERE 子句中進行復雜的字符串模式匹配。以下是核心用法和示例: 一、基礎語法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …

Prompt工程學習之自我一致性

自我一致性 (Self-consistency) 概念:該技術通過對同一問題采樣不同的推理路徑,并通過多數投票選擇最一致的答案,來解決大語言模型(LLM)輸出的可變性問題。通過使用不同的溫度(temp…

gh hugging face使用

install sudo dpkg -i gh_2.74.0_linux_amd64.deb gh auth login gh auth login ? Where do you use GitHub? GitHub.com ? What is your preferred protocol for Git operations on this host? HTTPS ? Authenticate Git with your GitHub credentials? Yes ? How wo…

2025.6.9總結(利與弊)

凡事都有兩面性。在大廠上班也不例外。今天找開發定位問題,從一個接口人不斷溯源到另一個 接口人。有時候,不知道是誰的責任填。將工作內容分的很細,每個人負責其中的一小塊。我清楚的意識到,自己就是個可以隨時替換的螺絲釘&…

數據集-目標檢測系列- 口紅嘴唇 數據集 lips >> DataBall

貴在堅持! * 相關項目 1)數據集可視化項目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2)數據集訓練、推理相關項目:GitHub - XIAN-HHappy/ultralytics-yolo-webui: ultralytics-yo…

[論文閱讀] 人工智能+項目管理 | 當 PMBOK 遇見 AI:傳統項目管理框架的破局之路

當PMBOK遇見AI:傳統項目管理框架的“AI適配指南” 論文信息 arXiv:2506.02214 Is PMBOK Guide the Right Fit for AI? Re-evaluating Project Management in the Face of Artificial Intelligence Projects Alexey Burdakov, Max Jaihyun Ahn Subjects: Software …

CentOS7關閉防火墻、Linux開啟關閉防火墻

文章目錄 一、firewalld開啟、關閉防火墻1、查看防火墻狀態 一、firewalld開啟、關閉防火墻 以下命令在linux系統CentOS7中操作開啟關閉防火墻 # 查詢防火墻狀態 systemctl status firewalld.service # 開啟防火墻 systemctl start firewalld.service # 開機自啟動防火墻 syste…

Spring是如何實現無代理對象的循環依賴

無代理對象的循環依賴 什么是循環依賴解決方案實現方式測試驗證 引入代理對象的影響創建代理對象問題分析 源碼見:mini-spring 什么是循環依賴 循環依賴是指在對象創建過程中,兩個或多個對象相互依賴,導致創建過程陷入死循環。以下通過一個簡…

Android 之 kotlin 語言學習筆記三(Kotlin-Java 互操作)

參考官方文檔:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬關鍵字 不要使用 Kotlin 的任何硬關鍵字作為方法的名稱 或字段。允許使用 Kotlin 的軟關鍵字、修飾符關鍵字和特殊標識…

從 GreenPlum 到鏡舟數據庫:杭銀消費金融湖倉一體轉型實踐

作者:吳岐詩,杭銀消費金融大數據應用開發工程師 本文整理自杭銀消費金融大數據應用開發工程師在StarRocks Summit Asia 2024的分享 引言:融合數據湖與數倉的創新之路 在數字金融時代,數據已成為金融機構的核心競爭力。杭銀消費金…

Bean 作用域有哪些?如何答出技術深度?

導語: Spring 面試繞不開 Bean 的作用域問題,這是面試官考察候選人對 Spring 框架理解深度的常見方式。本文將圍繞“Spring 中的 Bean 作用域”展開,結合典型面試題及實戰場景,幫你厘清重點,打破模板式回答&#xff0c…