MySQL 存儲引擎

来源:https://www.cnblogs.com/chy18883701161/archive/2020/03/05/12421786.html
-Advertisement-
Play Games

存儲引擎 DBMS使用存儲引擎進行數據的創建、查詢、更新、刪除操作。 不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎還可以獲得特定的功能。 MySQL提供了多種存儲引擎,最常見的有3種。 1、MyISAM MySQL5.5之前的預設的存儲引擎,每個MyISAM在磁碟上 ...


 

存儲引擎

DBMS使用存儲引擎進行數據的創建、查詢、更新、刪除操作。

不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎還可以獲得特定的功能。

MySQL提供了多種存儲引擎,最常見的有3種。

 

 


 

 

 

1、MyISAM 

MySQL5.5之前的預設的存儲引擎,每個MyISAM在磁碟上存儲成三個文件,文件名和表名相同,擴展名分別是

(1)frm文件:存儲表的定義

(2)MYD文件:存儲表中的數據(記錄)

(3)MYI文件:存儲索引。索引保存的是數據文件的指針

 

特點

  • 訪問速度快(優)
  • 支持全文索引(優)。但基本不使用MySQL的全文索引,全文索引一般都是使用第三方的ElasticSearch,Solr等更加成熟的解決方案。
  • 不支持事務、外鍵(缺)
  • 預設的鎖粒度為表級鎖,所以併發度很差(缺),但加鎖快,鎖衝突較少,不容易發生死鎖(優);
  • 對數據的查詢緩存只緩存索引,不緩存數據(記錄),而且使用的是操作系統本身的緩存。
  • 自動增長列可以是組合主鍵中的任何一列。設置自動增長列:創建表時,在欄位後加auto_increment,預設初始值是1

 

 

適用場景

  • 不需要事務
  • 不使用外鍵
  • 操作以select、insert為主

 

 

MyISAM支持三種不同的存儲格式

(1)靜態表(fixed)

表中不能包含變長欄位(比如VARCHAR, BLOB, TEXT),每個記錄都是固定的長度。如果MyISAM表中沒有一個變長欄位,則預設使用靜態表。

優點:存儲迅速,出現故障容易恢復

缺點:占用空間比動態表大。靜態表在進行數據存儲時會按照事先定義的列寬補足空格,但在訪問的時候會去掉補的空格

 

(2)動態表(dynamic)

可包含變長欄位(varchar、blob、text),如果一個MyISAM表包含任何可變長度的欄位,或者該表創建時用row_format=dynamic指定,則該表使用動態格式存儲

優點:占用空間小

缺點:頻繁的更新、刪除操作會產生碎片,需要定期用optimize table語句或myisamchk -r命令來改善性能,出現故障後較難恢復

 

(3)壓縮表

由myisampack工具創建,每條記錄都會被單獨壓縮,占據硬碟空間極小。

 

 


 

 

 

2、InnoDB 

MySQL5.5及其之後預設的存儲引擎

 

InnoDB有2種存儲方式

  • 共用表空間存儲:所有表的定義、數據、索引存放在同一個表空間中。
  • 獨占表空間存儲:一張表獨占一個表空間,表的定義保存在.frm文件中,數據、索引保存在.ibd文件中。

 

 

特點

  • 自動增長列必須是主鍵,如果是組合主鍵,也必須是組合主鍵的第一列
  • 支持外鍵約束。MySQL的存儲引擎中只有innoDB支持外鍵。外鍵降低了查詢速度(因為要查多張表)、使多張表耦合在一起,但更好地體現了實體、表之間的關聯。
  • 支持事務,恢復能力強。預設的事務隔離級別為可重覆讀
  • 使用的鎖粒度為行級鎖,支持更高的併發。行級鎖、事務,安全性有了,但是以犧牲效率換來的。
  • 會將查詢的結果(索引+數據)放到緩衝池中,加快後續查詢的速度
  • 發生故障後恢復性好。未完成的事務將根據redo log的數據重做;已提交但未寫入的修改,將從doublewrite buffer重做;系統閑時會purge buffer
  • 主鍵索引是聚集索引(Clustered index,僅InnoDB支持),根據主鍵查詢時效率高,但根據主鍵進行刪改時效率低。聚集索引:物理存儲順序與索引順序相同
  • 支持線上熱備

 

 

適用場景

  • 對安全性有要求(事務+恢復性好),比如財務、計費、銀行
  • 併發高(行級鎖)
  • 使用外鍵

 

可以在join查詢中混用InnoDB引擎的表、其他引擎的表

 

 


 

 

 

MyISAM、InnoDB的對比

(1)鎖粒度不同,InnoDB為行級鎖,MyISAM為表級鎖

  • InnoDB對併發的支持遠比MyISAM高
  • 但InnoDB鎖衝突的概率更大,更容易發生死鎖,而且為每一行加鎖,開銷也很大

 

(2)InnoDB支持外鍵,MyISAM不支持

 

(3)InnoDB支持事務,MyISAM不支持

  • InnoDB更安全,開銷也更大

 

(4)InnoDB緩存查詢到的索引、數據,MyISAM只緩存索引

 

(5)查詢效率MyISAM遠高於InnoDB,尤其是在數據表行數多的時候

  • MyISAM的索引中存儲的是數據(記錄)的指針(地址),先查索引確定要操作的記錄的地址,直接就去訪問這個地址
  • InnoDB的索引存儲的是記錄的行號,從索引中查到行號(行坐標),還需要逐行統計行號(從第一行開始數)
  • 而且InnoDB在查詢過程中,要維護緩衝池中的查詢緩存(索引+數據),MyISAM只需維護緩存中的索引

 

(6)InnoDB支持線上熱備,有很成熟的線上熱備解決方案


(7)MyISAM的表文件包括:.frm(表定義),.MYI(索引),.MYD(數據),InnoDB的表文件為.frm(表定義),.ibd(索引、數據)

 

一句話,MyISAM效率更高、速度更快,InnoDB功能更全、安全性更好、開銷更大。

 

 


 

 

 

3、MEMORY

數據(記錄)不是儲存在文件中,而是存儲在記憶體中。每個memory表對應一個.frm文件(表定義、索引)。

 

特點

  • 訪問速度極快。數據存放在記憶體中+使用HASH索引
  • 宕機、關閉伺服器,數據會丟失
  • 表的大小有限制(內初有限)
  • 對錶的數據類型有限制。比如:只支持定長類型,VARCHAR會被自動存儲為CHAR類型,不支持TEXT、BLOB
  • 鎖粒度為表級鎖。併發量大的時候,表級鎖會成為MEMORY存儲引擎的瓶頸

 

 

適用場景

  • 存儲臨時、不重要的數據
  • 大量讀 ,作為緩存

 

 


 

 

如何選擇合適的存儲引擎

  • 安全性要求(事務)
  • 併發高不高
  • 使不使用外鍵
  • 是否需要支持線上熱備

 

一個資料庫中,不同的表可以使用不同的存儲引擎。

使用合適的存儲引擎,會提高資料庫的性能。

 


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

-Advertisement-
Play Games
更多相關文章
  • Nginx日誌分析以及JBoss日誌分析 一、使用E.L.K安全分析Nginx日誌 1.Nginx日誌介紹: Nginx是高性能的、輕量級Web、反向代理和電子郵件代理伺服器,由俄羅斯訪問量第二的Rambler.ru站點開發; 簡稱"ngx",由於出色的性能,低資源消耗,在高併發應用系統中應用廣泛; ...
  • 本質: 是一門編程語言,有自己的語法和庫函數。 工作機理: 讀取每一行 按分隔符把這一行切成多個(不指定分隔符的話,空白或者連續空白就是分隔符) $1:代表第一列;$2:第二列。。。。 $0:整行內容 按需,按特定格式列印出來 功能: 可以限定處理哪些行 可以根據列的內容做條件分支處理 可以迴圈所有 ...
  • 1.登陸github後,進入Github首頁,點擊New repository新建一個項目 2. 填寫相應信息後點擊create repository即可 Repository name: 倉庫名稱(輸入名字,最好不要使用中文) Description(可選): 倉庫描述介紹 Public, Pri ...
  • Windows Apache日誌提取和安全分析 一、Apache日誌介紹: 1.Apache的訪問日誌功能由mod_log_config功能模塊提供,日誌格式為(CLF)Common Log Format。 2.Apache日誌的八個級別:emerg、alert、crit、error、warn、no ...
  • Windows IIS日誌提取和安全檢查分析 一、IIS日誌介紹: 1.IIS簡介: IIS全稱Internet Information Services,是由微軟公司提供的基於運行Microsoft Windwos的互聯網基本服務,IIS是一種Web(網頁)服務組件,其中包括Web伺服器、FTP服 ...
  • Step 1:更換阿裡雲 yum 源 Step 2:Apache 部分 安裝Apache : 啟動Apache服務 : 檢查Apache服務狀態是否running : 設置Apache服務自啟動守衛 : 此時,訪問伺服器的80埠,應可以看到Apache的預設頁。如果不能訪問,請檢查防火牆設置。 A ...
  • STT-MRAM是通過自旋電流實現信息寫入的一種新型非易失性磁隨機存儲器,是磁性存儲器MRAM的二代產品。STT-MRAM存儲的結構簡單,它省略了帶磁性外殼的附加寫信息線,最大限度地減少了製備工藝程式,並使存儲單元的橫截面積減小、存儲密度高、存儲速度快,滿足高性能電腦系統的設計要求。 研究人員建議 ...
  • 痞子衡嵌入式半月刊: 第 3 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: "JayHeng/pzh mcu bi weekly" ),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...