資料庫儲存引擎

2022-05-08 11:39:12 字數 4753 閱讀 7561

儲存引擎說白了就是如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料等技術的實現方

法。因為在關聯式資料庫中資料的儲存是以表的形式儲存的,所以儲存引擎也可以稱為表型別(即儲存和操作此表的型別)

sql 解析器、sql 優化器、緩衝池、儲存引擎等元件在每個資料庫中都存在,但不是每 個資料庫都有這麼多儲存引擎。mysql 的外掛程式式儲存引擎可以讓儲存引擎層的開發人員設 計他們希望的儲存層,例如,有的應用需要滿足事務的要求,有的應用則不需要對事務有這 麼強的要求 ;有的希望資料能持久儲存,有的只希望放在記憶體中,臨時並快速地提供對資料 的查詢。 

一種型別表明的是一種儲存方式

儲存引擎:就是表的型別,不同的型別就會對應不同的處理機制去處理他

事務:就是要麼同時成功,要麼同時不成功

mysql5.6支援的儲存引擎包括innodb、myisam、memory、csv、blackhole、federated、mrg_myisam、archive、performance_schema。

其中ndb和innodb提供事務安全表,其他儲存引擎都是非事務安全表。

innodb

mysql 5.6 版本預設的儲存引擎。innodb 是乙個事務安全的儲存引擎,它具備提交、回滾以及崩潰恢復的功能以保護使用者資料。innodb 的行級別鎖定以及 oracle 風格的一致性無鎖讀提公升了它的多使用者併發數以及效能。innodb 將使用者資料儲存在聚集索引中以減少基於主鍵的普通查詢所帶來的 i/o 開銷。為了保證資料的完整性,innodb 還支援外來鍵約束。

myisam

myisam既不支援事務、也不支援外來鍵、其優勢是訪問速度快,但是表級別的鎖定限制了它在讀寫負載方面的效能,因此它經常應用於唯讀或者以讀為主的資料場景。

memory

在記憶體中儲存所有資料,應用於對非關鍵資料由快速查詢的場景。memory型別的表訪問資料非常快,因為它的資料是存放在記憶體中的,並且預設使用hash索引,但是一旦服務關閉,表中的資料就會丟失

blackhole

黑洞儲存引擎,類似於 unix 的 /dev/null,archive 只接收但卻並不儲存資料。對這種引擎的表的查詢常常返回乙個空集。這種表可以應用於 dml 語句需要傳送到從伺服器,但主伺服器並不會保留這種資料的備份的主從配置中。

簡單地說,事務就是指邏輯上的一組sql語句操作,組成這組操作的各個sql語句,執行時要麼全成功要麼全失敗。

例如:你給我轉賬5塊錢,流程如下

a.從你銀行卡取出5塊錢,剩餘計算money-5

b.把上面5塊錢打入我的賬戶上,我收到5塊,剩餘計算money+5.

上述轉賬的過程,對應的sql語句為:

update 你_account set money=money-5 where name='你';

update 我_account set money=money+5 where name='我';

上述的兩條sql操作,在事務中的操作就是要麼都執行,要麼都不執行,不然錢就對不上了。

這就是事務的原子性(atomicity)。

事務的四大特性:1.原子性(atomicity)事務是乙個不可分割的單位,事務中的所有sql等操作要麼都發生,要麼都不發生。2.一致性(consistency)事務發生前和發生後,資料的完整性必須保持一致。3.隔離性(isolation)當併發訪問資料庫時,乙個正在執行的事務在執行完畢前,對於其他的會話是不可見的,多個併發事務之間的資料是相互隔離的。也就是其他人的操作在這個事務的執行過程中是看不到這個事務的執行結果的,也就是他們拿到的是這個事務執行之前的內容,等這個事務執行完才能拿到新的資料。4.永續性(durability)乙個事務一旦被提交,它對資料庫中的資料改變就是永久性的。如果出了錯誤,事務也不允撤銷,只能通過'補償性事務'。

innodb

用於事務處理應用程式,支援外來鍵和行級鎖。如果應用對事物的完整性有比較高的要求,在併發條件下要求資料的一致性,資料操作除了插入和查詢之外,還包括很多更新和刪除操作,那麼innodb儲存引擎是比較合適的。innodb除了有效的降低由刪除和更新導致的鎖定,還可以確保事務的完整提交和回滾,對於類似計費系統或者財務系統等對資料準確要求性比較高的系統都是合適的選擇。

myisam

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

memory

將所有的資料儲存在記憶體中,在需要快速定位記錄和其他類似資料的環境下,可以提供極快的訪問。memory的缺陷是對錶的大小有限制,雖然資料庫因為異常終止的話資料可以正常恢復,但是一旦資料庫關閉,儲存在記憶體中的資料都會丟失。

檢視當前的預設儲存引擎:

mysql> show variables like "

default_storage_engine";

查詢當前資料庫支援的儲存引擎

mysql> show engines \g;

在建表時指定

mysql> create table ai(id bigint(12),name varchar(200)) engine=myisam;

mysql> create table country(id int(4),cname varchar(50)) engine=innodb;

也可以使用alter table語句,修改乙個已經存在的表的儲存引擎。

mysql> alter table ai engine = innodb;

在配置檔案中指定

#my.ini檔案

[mysqld]

default-storage-engine=innodb

不同引擎在建立表的時候生成檔案的不同

建立四個表,分別使用innodb,myisam,memory,blackhole儲存引擎,進行插入資料測試

#下面是使用四個不同的引擎來建立的表

create table t1(id int)engine=innodb;

create table t2(id int)engine=myisam;

create table t3(id int)engine=memory;

create table t4(id int)engine=blackhole;

通過四種引擎來建立的表,我們對照著其生成的檔案來看一下區別,看下圖:

關於上面的檔案作用介紹:

1.db.opt檔案:用來記錄該庫的預設字符集編碼和字符集排序規則用的。也就是說如果你建立資料庫指定預設字符集和排序規則,那麼後續建立的表如果沒有指定字符集和排序規則,那麼該新建的表將採用db.opt檔案中指定的屬性。

2.字尾名為.frm的檔案:這個檔案主要是用來描述資料表結構(id,name欄位等)和字段長度等資訊

3.字尾名為.ibd的檔案:這個檔案主要儲存的是採用獨立表儲存模式時儲存資料庫的資料資訊和索引資訊;

4.字尾名為.myd(mydata)的檔案:從名字可以看出,這個是儲存資料庫資料資訊的檔案,主要是儲存採用獨立表儲存模式時儲存的資料資訊;

5.字尾名為.myi的檔案:這個檔案主要儲存的是資料庫的索引資訊;

6.ibdata1檔案:主要作用也是儲存資料資訊和索引資訊,這個檔案在mysql安裝目錄的data資料夾下。

從上面可以看出,.ibd儲存的是資料資訊和索引資訊,ibdata1檔案也是儲存資料資訊和索引資訊,.myd和.myi也是分別儲存資料資訊和索引資訊,那他們之間有什麼區別呢? 

主要區別是再於資料庫的儲存引擎不一樣,如果儲存引擎採用的是myisam,則生成的資料檔案為表名.frm、表名.myd、表名的myi;而儲存引擎如果是innodb,開啟了innodb_file_per_table=1,也就是採用獨立儲存的模式,生成的檔案是表名.frm、表名.ibd,如果採用共儲存模式的,資料資訊和索引資訊都儲存在ibdata1(在裡面進行分類,從外面看是乙個檔案)中;

在進行資料恢復的時候,如果用的是myisam資料引擎,那麼資料很好恢復,只要將相應.frm, .myd, .myi檔案拷貝過去即可。但是如果是innodb的話,則每乙個資料表都是乙個單獨的檔案,只將相應的.frm和.ibd檔案拷貝過去是不夠的,必須在你的ibd檔案的tablespace id和ibdata1檔案中的元資訊的tablespace id一致才可以。

msyql人家設定的規則就是這樣儲存表的,使用人家的系統,就要理解人家的規則。

mysql架構總共四層,在上圖中以虛線作為劃分。 

首先,最上層的服務並不是mysql獨有的,大多數給予網路的客戶端/伺服器的工具或者服務都有類似的架構。比如:連線處理、授權認證、安全等。 

第二層的架構包括大多數的mysql的核心服務。包括:查詢解析、分析、優化、快取以及所有的內建函式(例如:日期、時間、數學和加密函式)。同時,所有的跨儲存引擎的功能都在這一層實現:儲存過程、觸發器、檢視等。

第三層包含了儲存引擎。儲存引擎負責mysql中資料的儲存和提取。伺服器通過api和儲存引擎進行通訊。這些介面遮蔽了不同儲存引擎之間的差異,使得這些差異對上層的查詢過程透明化。儲存引擎api包含十幾個底層函式,用於執行「開始乙個事務」等操作。但儲存引擎一般不會去解析sql(innodb會解析外來鍵定義,因為其本身沒有實現該功能),不同儲存引擎之間也不會相互通訊,而只是簡單的響應上層的伺服器請求。

第四層包含了檔案系統,所有的表結構和資料以及使用者操作的日誌最終還是以檔案的形式儲存在硬碟上。

資料庫儲存引擎

mysql中提到了儲存引擎這個概念。簡而言之,儲存引擎就是表的型別。資料庫的儲存引擎決定了表在計算機中的儲存方式。show engines語句可以檢視mysql資料庫支援的儲存引擎。innodb儲存引擎給mysql的表提供了事物,回滾,崩潰修復和多版本併發控制的事物安全。innodb是mysql上第...

資料庫儲存引擎

儲存引擎 處理表的處理器 1 基本操作 1 檢視所有的儲存引擎 show engines 2 檢視已有表的儲存引擎 show create table 表名 engine innodb 3 建立表時指定儲存引擎 create table 表名 engine myisam 4 工作中常用儲存引擎 in...

資料庫儲存引擎

資料庫引擎簡單來說就是乙個 資料庫發動機 當你訪問資料庫時,不管是手工訪問,還是程式訪問,都不是直接讀寫資料庫檔案,而是通過資料庫引擎去訪問資料庫檔案。以關係型資料庫為例,你發sql語句給資料庫引擎,資料庫引擎解釋sql語句,提取出你需要的資料返回給你。因此,對訪問者來說,資料庫引擎就是sql語句的...