MySQL學習之路 一 資料庫儲存引擎

2021-09-21 04:30:58 字數 4652 閱讀 3982

儲存引擎是什麼?

mysql中的資料用各種不同的技術儲存在檔案(或者記憶體 )中。這些技術中的每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。

例如,如果你在研究大量的臨時資料,你也許需要使用記憶體儲存引擎。記憶體儲存引擎能夠在記憶體中儲存所有的**資料。又或者,你也許需要乙個支援事務處理的資料庫(以確保事務處理不成功時資料的回退能力)。

這些不同的技術以及配套的相關功能在mysql中被稱作儲存引擎(也稱作表型別)。mysql預設配置了許多不同的儲存引擎,可以預先設定或者在mysql伺服器

中啟用。你可以選擇適用於伺服器、資料庫和**的儲存引擎,以便在選擇如何儲存你的資訊、如何檢索這些資訊以及你需要你的資料結合什麼效能和功能的時候為你提供最大的靈活性。

選擇如何儲存和檢索你的資料的這種靈活性是mysql為什麼如此受歡迎的主要原因。其它資料庫系統(包括大多數商業選擇)僅支援一種型別的資料儲存。遺憾的是,其它型別的資料庫解決方案 採取的「乙個尺碼滿足一切需求」的方式意味著你要麼就犧牲一些效能,要麼你就用幾個小時甚至幾天的時間詳細調整你的資料庫。使用mysql,我們僅需要修改我們使用的儲存引擎就可以了。

在這篇文章中,我們不準備集中討論不同的儲存引擎的技術方面的問題(儘管我們不可避免地要研究這些因素的某些方面),相反,我們將集中介紹這些 不同的引擎分別最適應哪種需求和如何啟用不同的儲存引擎。為了實現這個目的,在介紹每乙個儲存引擎的具體情況之前,我們必須要了解一些基本的問題.

如何確定有哪些儲存引擎可用

你可以在mysql(假設是mysql伺服器 5.6以上版本)中使用顯示引擎的命令得到乙個可用引擎的列表。

這個**顯示了可用的資料庫引擎的全部名單以及在當前的資料庫伺服器中是否支援這些引擎。

使用乙個指定的儲存引擎

更靈活的方式是在隨mysql伺服器發布同時提供的mysql客戶端時指定使用的儲存引擎。最直接的方式是在建立表時指定儲存引擎的型別,向下面這樣:

create table mytable (id int, title char(20)) engine = innodb

你還可以改變現有的表使用的儲存引擎,用以下語句:

alter table mytable engine = myisam

然而,你在以這種方式修改**型別的時候需要非常仔細,因為對不支援同樣的索引、字段型別或者表大小的乙個型別進行修改可能使你丟失資料。如果你指定乙個在你的當前的資料庫中不存在的乙個儲存引擎,那麼就會建立乙個myisam(預設的)型別的表。

各儲存引擎之間的區別

為了做出選擇哪乙個儲存引擎的決定,我們首先需要考慮每乙個儲存引擎提供了哪些不同的核心功能。這種功能使我們能夠把不同的儲存引擎區別開來。我們 一般把這些核心功能分為四類:支援的字段和資料型別、鎖定型別、索引和處理。一些引擎具有能過促使你做出決定的獨特的功能,我們一會兒再仔細研究這些具體 問題。

欄位和資料型別

雖然所有這些引擎都支援通用的資料型別,例如整型、實型和字元型等,但是,並不是所有的引擎都支援其它的字段型別,特別是blog(二進位製大物件)或者text文字型別。其它引擎也許僅支援有限的字元寬度和資料大小。

這些侷限性可能直接影響到你可以儲存的資料,同時也可能會對你實施的搜尋的型別或者你對那些資訊建立的索引產生間接的影響。這些區別能夠影響你的應用程式的效能和功能,因為你必須要根據你要儲存的資料型別選擇對需要的儲存引擎的功能做出決策。

鎖定資料庫引擎中的鎖定功能決定了如何管理資訊的訪問和更新。當資料庫中的乙個物件為資訊更新鎖定了,在更新完成之前,其它處理不能修改這個資料(在某些情況下還不允許讀這種資料)。

鎖定不僅影響許多不同的應用程式如何更新資料庫中的資訊,而且還影響對那個資料的查詢。這是因為查詢可能要訪問正在被修改或者更新的資料。總的 來說,這種延遲是很小的。大多數鎖定機制主要是為了防止多個處理更新同乙個資料。由於向資料中插入資訊和更新資訊這兩種情況都需要鎖定,你可以想象,多個 應用程式使用同乙個資料庫可能會有很大的影響。

不同的儲存引擎在不同的物件級別支援鎖定,而且這些級別將影響可以同時訪問的資訊。得到支援的級別有三種:表鎖定、塊鎖定和行鎖定。支援最多的 是表鎖定,這種鎖定是在myisam中提供的。在資料更新時,它鎖定了整個表。這就防止了許多應用程式同時更新乙個具體的表。這對應用很多的多使用者資料庫 有很大的影響,因為它延遲了更新的過程。

頁級鎖定使用berkeley db引擎,並且根據上載的資訊頁(8kb)鎖定資料。當在資料庫的很多地方進行更新的時候,這種鎖定不會出現什麼問題。但是,由於增加幾行資訊就要鎖定資料結構的最後8kb,當需要增加大量的行,也別是大量的小型資料,就會帶來問題。

行級鎖定提供了最佳的並行訪問功能,乙個表中只有一行資料被鎖定。這就意味著很多應用程式能夠更新同乙個表中的不同行的資料,而不會引起鎖定的問題。只有innodb儲存引擎支援行級鎖定。

建立索引

建立索引在搜尋和恢復資料庫中的資料的時候能夠顯著提高效能。不同的儲存引擎提供不同的製作索引的技術。有些技術也許會更適合你儲存的資料型別。

有些儲存引擎根本就不支援索引,其原因可能是它們使用基本表索引(如merge引擎)或者是因為資料儲存的方式不允許索引(例如federated或者blackhole引擎)。

事務處理

事務處理功能通過提供在向表中更新和插入資訊期間的可靠性。這種可靠性是通過如下方法實現的,它允許你更新表中的資料,但僅當應用的應用程式的 所有相關操作完全完成後才接受你對錶的更改。例如,在會計處理中每一筆會計分錄處理將包括對借方科目和貸方科目資料的更改,你需要要使用事務處理功能保證 對借方科目和貸方科目的資料更改都順利完成,才接受所做的修改。如果任一項操作失敗了,你都可以取消這個事務處理,這些修改就不存在了。如果這個事務處理 過程完成了,我們可以通過允許這個修改來確認這個操作。

你可以通過修改設定指令碼中的選項來設定在mysql安裝軟體中可用的引擎。如果你在使用乙個預先包裝好的mysql二進位制發布版軟體,那麼,這個軟體就包含了常用的引擎。然而,需要指出的是,如果你要使用某些不常用 的引擎,特別是csv、rchive(存檔)和blackhole(黑洞)引擎,你就需要手工重新編譯mysql原始碼 。

mysql儲存引擎比較

mysql常用的儲存引擎為myisam、innodb、memory、merge,其中innodb提供事務安全表,其他儲存引擎都是非事務安全表。 

myisam是基於isam儲存引擎。myisam不支援事務、也不支援外來鍵,但其訪問速度快,對事務完整性沒有要求。 

innodb是目前mysql版本的預設儲存引擎。它提供了,具有提交、回滾和崩潰恢復能力的事務安全。但是比起myisam儲存引擎,innodb寫的處理效率差一些並且會占用更多的磁碟空間以保留資料和索引。 

memory儲存引擎使用存在記憶體中的內容來建立表。每個memory表只實際對應乙個磁碟檔案。memory型別的表訪問非常得快,因為它的資料是放在記憶體中的,並且預設使用hash索引。但是一旦服務關閉,表中的資料就會丟失掉。 

merge儲存引擎是一組myisam表的組合,這些myisam表必須結構完全相同。merge表本身沒有資料,對merge型別的表進行查詢、更新、刪除的操作,就是對內部的myisam表進行的。 

myisam表還支援3中不同的儲存格式: 

1 靜態表 

2 動態表 

3 壓縮表 

靜態表是預設的儲存格式,靜態表中的字段都是非變長的字段,優點是:儲存非常迅速,容易快取,出現故障容易恢復;缺點是:占用的空間通常比動態表多。(注意: 在儲存時,列的寬度不足時,用空格補足,當時在訪問的時候並不會得到這些空格) 

動態表的字段是變長的,優點是:占用的空間相對較少,但是頻繁地更新刪除記錄會產生碎片,需要定期改善效能,並且出現故障的時候恢復相對比較困難。 

壓縮表占用磁碟空間小,每個記錄是被單獨壓縮的,所以只有非常小的訪問開支。 

mysql支援外來鍵儲存引擎只有innodb,在建立外來鍵的時候,要求附表必須有對應的索引,子表在建立外來鍵的時候也會自動建立對應的索引。 

innodb儲存方式為兩種:1 使用共享表空間儲存 2 使用多表空間 

memory 型別的儲存引擎主要用於那些內容變化不頻繁的**表,或者作為統計操作的中間結果表,便於高效地堆中間結果進行分析並得到最終的統計結果。對memory 儲存引擎的表進行更新操作要謹慎,因為資料並沒有實際寫入到磁碟中,所以一定要對下次重新啟動服務後如何獲得這些修改後的資料有所考慮。 

merge用於將一系列等同的myisam表以邏輯方式組合在一起,並作為乙個物件引用它。merge表的優點在於可以突破對單個myisam表大小的限制,通過將不同的表分布在多個磁碟上,可以有效的改善merge表的訪問效率。

功能myisam

memory

innodb

archive

儲存限制

256tb

ram64tb

none

支援事務

nono

yesno

支援全文索引

yesno

nono

支援數索引

yesyes

yesno

支援雜湊索引

noyes

nono

支援資料快取

non/a

yesno

支援外來鍵

nono

yesno

MySQL學習之路(一) 資料庫是什麼?

計算機中的資料一般以硬碟為儲存空間,硬碟可以保證計算機內的資料能夠持久儲存。對於資料的處理,一般會採用資料庫相關的技術進行處理操作,從而保證資料處理的高效性。加粗樣式 資料庫是進行資料管理的一種有效技術,是由一批資料組成的有序集合,這些資料被存放在結構化的資料表裡。資料表之間互相關聯,反映客觀事物間...

MySQL資料庫(一) 資料庫基礎

資料庫介紹 db database 資料庫 dbms database management system 資料庫管理系統 dba 資料庫管理員 database administrator 資料 描述事物的符號記錄稱為記錄 數字 文字 影象 聲音 表 不同的組織記錄在一起形成表 資料庫 資料的集合...

MySQL(一)資料庫概念

一 資料庫 是使用者存放資料 訪問資料 運算元據的儲存倉庫,使用者的各種資料被有組織的存放在資料庫中。可以隨時被有許可權的使用者查詢 統計 新增 刪除 和修改,是長期儲存在計算機內的,有組織 可共享的資料集合。二 資料模型 1 層次模型 層次模型若用圖來表示,層次模型是一棵倒立的樹。在資料庫中,滿足...