MySQL儲存引擎你們知道多少?

2021-09-27 11:01:31 字數 2583 閱讀 8852

mysql是我們經常使用的資料庫處理系統(dbms),不知小夥伴們有沒有注意過其中的「儲存引擎」(storage_engine)呢?有時候面試題中也會問道mysql幾種常用的儲存引擎的區別。這次就簡短侃一下儲存引擎那些事兒。

先去查一下「引擎」概念。

引擎(engine)是電子平台上開發程式或系統的核心元件。利用引擎,開發者可迅速建立、鋪設程式所需的功能,或利用其輔助程式的運轉。一般而言,引擎是乙個程式或一套系統的支援部分。常見的程式引擎有遊戲引擎,搜尋引擎,防毒引擎等。

ok,我們知道了,引擎就是乙個程式的核心元件。

簡單來說,儲存引擎就是指 表的型別以及表在計算機上的儲存方式 。

儲存引擎的概念是mysql的特點,oracle中沒有專門的儲存引擎的概念,oracle有oltp和olap模式的區分。不同的儲存引擎決定了mysql資料庫中的表可以用不同的方式來儲存。我們可以根據資料的特點來選擇不同的儲存引擎。

在mysql中的儲存引擎有很多種,可以通過「show engines」語句來檢視。下面重點關注innodb、myisam、memory這三種。

一.innodb儲存引擎

innodb給mysql的表提供了 事務處理 、 回滾 、 崩潰修復能力 和 多版本併發控制 的事務安全。在mysql從3.23.34a開始包含innnodb。它是mysql上第乙個提供外來鍵約束的表引擎。而且innodb對事務處理的能力,也是其他儲存引擎不能比擬的。靠後版本的mysql的預設儲存引擎就是innodb。

innodb儲存引擎總支援 auto_increment 。自動增長列的值不能為空,並且值必須唯一。mysql中規定自增列必須為主鍵。在插入值的時候,如果自動增長列不輸入值,則插入的值為自動增長後的值;如果輸入的值為0或空(null),則插入的值也是自動增長後的值;如果插入某個確定的值,且該值在前面沒有出現過,就可以直接插入。

innodb還支援 外來鍵(foreign key) 。外來鍵所在的表叫做子表,外來鍵所依賴(references)的表叫做父表。父表中被字表外來鍵關聯的字段必須為主鍵。當刪除、更新父表中的某條資訊時,子表也必須有相應的改變,這是資料庫的 參照完整性規則。

innodb中,建立的表的表結構儲存在.frm檔案中(我覺得是frame的縮寫吧)。資料和索引儲存在innodb_data_home_dir和innodb_data_file_path定義的表空間中。

innodb的優勢在於提供了良好的事務處理、崩潰修復能力和併發控制。缺點是讀寫效率較差,占用的資料空間相對較大。

二.myisam儲存引擎

myisam是mysql中常見的儲存引擎,曾經是mysql的預設儲存引擎。myisam是基於isam引擎發展起來的,增加了許多有用的擴充套件。

myisam的表儲存成3個檔案。檔案的名字與表名相同。拓展名為frm、myd、myi。其實,frm檔案儲存表的結構;myd檔案儲存資料,是mydata的縮寫;myi檔案儲存索引,是myindex的縮寫。

基於myisam儲存引擎的表支援3種不同的儲存格式。包括靜態型、動態型和壓縮型。其中,靜態型是myisam的預設儲存格式,它的字段是固定長度的;動態型包含變長字段,記錄的長度不是固定的;壓縮型需要用到myisampack工具,占用的磁碟空間較小。

myisam的優勢在於占用空間小,處理速度快。缺點是不支援事務的完整性和併發性。

三.memory儲存引擎

memory是mysql中一類特殊的儲存引擎。它使用儲存在記憶體中的內容來建立表,而且 資料全部放在記憶體中 。這些特性與前面的兩個很不同。

每個基於memory儲存引擎的表實際對應乙個磁碟檔案。該檔案的檔名與表名相同,型別為frm型別。該檔案中只儲存表的結構。而其資料檔案,都是儲存在記憶體中,這樣有利於資料的快速處理,提高整個表的效率。值得注意的是,伺服器需要有足夠的記憶體來維持memory儲存引擎的表的使用。如果不需要了,可以釋放記憶體,甚至刪除不需要的表。

memory預設使用雜湊索引。速度比使用b型樹索引快。當然如果你想用b型樹索引,可以在建立索引時指定。

注意,memory用到的很少,因為它是把資料存到記憶體中,如果記憶體出現異常就會影響資料。如果重啟或者關機,所有資料都會消失。因此,基於memory的表的生命週期很短,一般是一次性的。

四.怎樣選擇儲存引擎

在實際工作中,選擇乙個合適的儲存引擎是乙個比較複雜的問題。每種儲存引擎都有自己的優缺點,不能籠統地說誰比誰好。

innodb:支援事務處理,支援外來鍵,支援崩潰修復能力和併發控制。如果需要 對事務的完整性要求比較高 (比如銀行), 要求實現併發控制 (比如售票),那選擇innodb有很大的優勢。如果需要 頻繁的更新、刪除 操作的資料庫,也可以選擇innodb,因為支援事務的提交(commit)和回滾(rollback)。

myisam:插入資料快,空間和記憶體使用比較低。如果表主要是 用於插入新記錄和讀出記錄 ,那麼選擇myisam能實現處理高效率。如果應用的完整性、併發性要求比 較低,也可以使用。

memory:所有的資料都在記憶體中,資料的處理速度快,但是安全性不高。如果需要 很快的讀寫速度 ,對資料的安全性要求較低,可以選擇memoey。它對錶的大小有要求,不能建立太大的表。所以,這類資料庫只使用在相對較小的資料庫表。

注意,同乙個資料庫也可以使用多種儲存引擎的表。如果乙個表要求比較高的事務處理,可以選擇innodb。這個資料庫中可以將查詢要求比較高的表選擇myisam儲存。如果該資料庫需要乙個用於查詢的臨時表,可以選擇memory儲存引擎。

MySQL儲存引擎知多少

mysql是我們經常使用的資料庫處理系統 dbms 不知小夥伴們有沒有注意過其中的 儲存引擎 storage engine 呢?有時候面試題中也會問道mysql幾種常用的儲存引擎的區別。這次就簡短侃一下儲存引擎那些事兒。先去查一下 引擎 概念。引擎 engine 是電子平台上開發程式或系統的核心元件...

你們對數字到底知道多少?

玩這個的很多人會覺得,不就是十個數字嗎?0到9,可能會非常簡單,沒錯0到9非常簡單,甚至小學生也能倒背如流,甚至乙個沒有接受過任何教育,沒有接受過任何培訓的人他都能非常熟悉。但是你們知道嗎?數字之間其實蘊藏了太多的關聯和資訊和內在的邏輯。但是很多人不明白,當然這個我們能理解,因為大部分人都都是用肉眼...

mysql儲存引擎 mysql儲存引擎簡介

精品推薦 什麼是儲存引擎 mysql儲存引擎是資料庫如何儲存資料 怎樣建立索引以及如何查詢更新資料等技術的實現方法,資料通過使用不同的技術儲存在檔案中,使用不同的儲存機制 索引方式來提供不同的功能。在mysql這種關係型資料中心來說,資料是以表的方式來儲存的,因此,簡單點來說,儲存引擎就是儲存和操作...