Mysql進階篇(一)之存儲引擎

来源:https://www.cnblogs.com/yun3k/archive/2023/07/05/17528134.html
-Advertisement-
Play Games

# 一. MySQL體繫結構 ![](https://tcs-devops.aliyuncs.com/storage/112v957e3962f4a8a6d4d8eb1a194d885fa0?Signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBcHB ...


一. MySQL體繫結構

1. 連接層

最上層是一些客戶端和鏈接服務,包含本地sock通信和大多數基於客戶端/服務端工具實現的類似於TCP/IP的通信。主要完成一些類似於連接處理、授權認證及相關的安全方案。在該層上引入了線程池的概念,為通過認證安全接入的客戶端提供線程。同樣在該層上可以實現基於SSL的安全鏈接。伺服器也會為安全接入的每個客戶端驗證它所具有的操作許可權。

2. 服務層

第二層架構主要完成大多數的核心服務功能,如SQL介面,並完成緩存的查詢,SQL的分析和優化,部分內置函數的執行。所有跨存儲引擎的功能也在這一層實現,如過程、函數等。在該層,伺服器會解析查詢並創建相應的內部解析樹,並對其完成相應的優化如確定表的查詢順序,是否利用索引等,最後生成相應的執行操作。如果是select語句,伺服器還會查詢內部的緩存,如果緩存空間足夠大,這樣在解決大量讀操作的環境中能夠很好的提升系統的性能。

3. 引擎層

存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,伺服器通過API和存儲引擎進行通信。不同的存儲引擎具有不同的功能,這樣我們可以根據自己的需求來選取合適的存儲引擎。資料庫中的索引是在存儲引擎層實現的。

4. 存儲層

數據存儲層,主要是將數據(如:redolog、undolog、數據、索引、二進位日誌、錯誤日誌、查詢日誌、慢查詢日誌等)存儲在文件系統之上,並完成與存儲引擎的交互。

和其他資料庫相比,MySQL有點與眾不同,它的架構可以在多種不同場景中應用併發揮良好作用。主要體現在存儲引擎上,插件式的存儲引擎架構,將查詢處理和其他的系統任務以及數據的存儲提取分離。這種架構可以根據業務的需求和實際需要選擇合適的存儲引擎。

二. 存儲引擎介紹

存儲引擎就是存儲數據、建立索引、更新/查詢數據等技術的實現方式。存儲引擎是基於表的,而不是基於庫的,所以存儲引擎也可稱為表類型。我們可以在創建表的時候,來指定選擇的存儲引擎,如果沒有指定將自動選擇預設的存儲引擎。

1. 建表時指定存儲引擎

CREATE TABLE 表名( 
	欄位1 欄位1類型 [ COMMENT 欄位1註釋 ] , 
	...... 
	欄位n 欄位n類型 [COMMENT 欄位n註釋 ] 
) ENGINE = INNODB [ COMMENT 表註釋 ] ;

(1). 案例1:查詢建表語句 --- 預設存儲引擎:InnoDB

show create table account;

2. 查詢當前資料庫支持的存儲引擎

show engines;

(1). 案例1:創建表my_myisam,並指定MyISAM存儲引擎

create table my_myisam( 
	id int, 
	name varchar(10) 
) engine = MyISAM;

(2). 創建表my_memory,指定Memory存儲引擎

create table my_memory( 
	id int, 
	name varchar(10) 
) engine = Memory;

三. 存儲引擎特點

1. InnoDB

(1). 介紹

InnoDB是一種兼顧高可靠性和高性能的通用存儲引擎,在MySQL 5.5之後,InnoDB是預設的MySQL存儲引擎。

(2). 特點

  • DML操作遵循ACID模型,支持事務;

  • 行級鎖,提高併發訪問性能;

  • 支持外鍵FOREIGN KEY約束,保證數據的完整性和正確性;

(3). 文件

xxx.ibd:xxx代表的是表名,innoDB引擎的每張表都會對應這樣一個表空間,存儲該表的表結構(frm-早期的、sdi-新版的)、數據和索引。

參數:innodb_file_per_table

show variables like 'innodb_file_per_table';

如果該參數開啟,代表對於InnoDB引擎的表,每一張表都對應一個ibd文件。我們直接打開MySQL的數據存放目錄,這個目錄下有很多文件夾,不同的文件夾代表不同的資料庫,我們直接打開yun3k文件夾。

可以看到裡面有很多的idb文件,每一個ibd文件就對應一張表,比如:我們有一張表account,就會有這樣一個account.ibd文件,而在這個ibd文件中不僅存放表結構、數據、還會存放該表對應的索引信息。而該文件是基於二進位存儲的,不能直接基於記事本打開,我們可以使用mysql提供的一個指令ibd2sdi,通過該指令就可以從ibd文件中提取sdi信息,而sdi數據字典信息中就包含該表的表結構。

(4). 邏輯存儲結構

  • 表空間:InnoDB存儲引擎邏輯結構的最高層,ibd文件其實就是表空間文件,在表空間中可以包含多個Segment段。

  • 段:表空間是由各個段組建的,常見的段有數據段、索引段、回滾段等。InnoDB中對於段的管理,都是引擎自身完成,不需要人為對其控制,一個段中包含多個區。

  • 區:區是表空間的單元結構,每個區的大小為1M。預設情況下,InnoDB存儲引擎頁大小為16k,即一個區中一共有64個連續的頁。

  • 頁:頁是組成區的最小單元,頁也是InnoDB存儲引擎磁碟管理的最小單元,每個頁的大小預設為16KB。為了保證頁的連續性,InnoDB存儲引擎每次從磁碟申請4-5個區。

  • 行:InnoDB存儲引擎是面向行的,也就是說數據是按行進行存放的,在每一行中除了定義表時所指定的欄位以外,還包含兩個隱藏欄位(後面會詳細介紹)。

2. MyISAM

(1). 介紹

MyISAM是MySQL早期的預設存儲引擎。

(2). 特點

不支持事務,不支持外鍵

支持表鎖,不支持行鎖

訪問速度快

(3). 文件

xxx.sdi:存儲表結構信息

xxx.MYD:存儲數據

xxx.MYI:存儲索引

3. Memory

(1). 介紹

Memory引擎的表數據是存儲在記憶體中的,由於受到硬體問題或斷電問題的影響,只能將這些表作為臨時表或緩存使用。

(2). 特點

記憶體存放

hash索引(預設)

(3). 文件

xxx.sdi:存儲表結構信息

4. InnoDB、MyISAM和Memory的區別及特點

特點 InnoDB MyISAM Memory
存儲限制 64TB
事務安全 支持 - -
鎖機制 行鎖 表鎖 表鎖
B+tree索引 支持 支持 支持
Hash索引 - - 支持
全文索引 支持(5.6版本之後) 支持 -
空間使用 N/A
記憶體使用 中等
批量插入速度
支持外鍵 支持 -

四. 存儲引擎的選擇

在選擇存儲引擎時,應該根據應用系統的特點選擇合適的存儲引擎。對於複雜的應用系統,還可以根據實際情況選擇多種存儲引擎進行結合。

  • InnoDB:是Mysql的預設存儲引擎,支持事務、外鍵。如果應用對事務的完整性有比較高的要求,在併發條件下要求數據的一致性,數據操作除了插入和查詢之外,還包含很多的更新、刪除操作,那麼InnoDB存儲引擎是比較合適的選擇。

  • MyISAM:如果應用是以讀操作和插入操作為主,只有很少的更新和刪除操作,並且對事務的完整性、併發性要求不是很高,那麼選擇這個存儲引擎是非常合適的。

  • Memory:將所有數據保存在記憶體中,訪問速度快,通常用於臨時表及緩存。MEMORY的缺陷就是對錶的大小有限制,太大的表無法緩存在記憶體中,而且無法保障數據的安全。

更多mysql學習請關註微信公眾號”雲哥技術yun3k”,回覆”mysql學習”,免費領取mysql全套學習資料。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 個人認為百度地圖開放平臺確實很好用但就是C#的SN校驗會出現以下幾個問題 一、官方的示例代碼說的不清不楚 獲取SN函數的Uri應該使用不帶功能變數名稱的Uri 比如:最終請求地址為https://api.map.baidu.com/location/ip?ip=119.126.10.15&coor=gcj0 ...
  • ## 一:背景 ### 1. 講故事 前段時間有位朋友找到我,說他們的工業視覺軟體僵死了,讓我幫忙看下到底是什麼情況,哈哈,其實卡死的問題相對好定位,無非就是看主線程棧嘛,然後就是具體問題具體分析,當然難度大小就看運氣了。 前幾天看一篇文章說現在的 .NET程式員 不需要學習**WinDbg** , ...
  • 記憶體“泄露”是開發中常見的問題之一,它會導致應用程式占用越來越多的記憶體資源,最終可能導致系統性能下降甚至崩潰。軟體開發者需要瞭解在程式中出現記憶體泄露的情況,以避免軟體出現該的問題。 **什麼是記憶體“泄露”?** 記憶體泄露是申請了記憶體空間的變數一直在占用,無法釋放。比如申請了一塊記憶體空間,沒有回收一直 ...
  • # lvm邏輯捲 ## 前言 > raid磁碟陣列技術,提高硬碟的讀寫效率,以及數據的安全,raid的缺點在於: > 1.當你配置好了raid磁碟陣列組,容量的大小,已經是限定了,如果你存儲的業務非常多,磁碟容量不夠用的問題就會出現,你想要擴容磁碟的空間,就會非常麻煩。 > 2.不同的磁碟分區,相對 ...
  • > 本篇內容主要來源於自己學習的視頻,如有侵權,請聯繫刪除,謝謝。 ### 1、etcd讀請求概覽 etcd是典型的`讀多寫少`存儲,在我們實際業務場景中,讀一般占據2/3以上的請求。一個讀 請求從client通過`Round-robin(輪詢)`負載均衡演算法,選擇一個etcd server節點,發 ...
  • # Shuffle的深入理解 什麼是Shuffle,本意為洗牌,在數據處理領域裡面,意為將數打散。 問題:shuffle一定有網路傳輸嗎?有網路傳輸的一定是Shuffle嗎? ## Shuffle的概念 通過網路將數據傳輸到多台機器,數據被打散,但是有網路傳輸,不一定就有shuffle,Shuffl ...
  • 向量資料庫是一種特殊類型的資料庫,它可以存儲和處理向量數據。向量數據通常用於表示多維度的數據點,例如在機器學習和人工智慧中使用的數據。在向量資料庫中,數據被表示為向量,這些向量可以在多維空間中進行比較和搜索。 ...
  • 隨著業務的發展,[實時場景](https://www.dtstack.com/dtinsight/streamworks?src=szsm)在各個⾏業中變得越來越重要。⽆論是⾦融、電商還是物流,實時數據處理都成為了其中的關鍵環節。Flink 憑藉其強⼤的[流處理特性](https://www.dts ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...