1. 程式人生 > >MySql資料庫引擎相關總結

MySql資料庫引擎相關總結

本文介紹MySql資料庫常用的引擎,並介紹了MyISAM和InnoDB的比較,聚簇索引和非聚簇索引的比較。

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

這些不同的技術以及配套的相關功能在MySQL中被稱作儲存引擎(也稱作表型別)。MySQL預設配置了許多不同的儲存引擎,可以預先設定或者在MySQL伺服器中啟用。你可以選擇適用於伺服器、資料庫和表格的儲存引擎,以便在選擇如何儲存你的資訊、如何檢索這些資訊以及你需要你的資料結合什麼效能和功能的時候為你提供最大的靈活性。

用於儲存、處理和保護資料的核心服務。利用資料庫引擎可控制訪問許可權並快速處理事務,從而滿足企業內大多數需要處理大量資料的應用程式的要求。 使用資料庫引擎建立用於聯機事務處理或聯機分析處理資料的關係資料庫。這包括建立用於儲存資料的表和用於檢視、管理和保護資料安全的資料庫物件(如索引、檢視和儲存過程)。

2. 常用資料庫引擎

預設情況下,MYSQL支援三個引擎:ISAM、MYISAM和HEAP。另外兩種型別INNODB和BERKLEY(BDB),也常常可以使用。

ISAM:它在設計之時就考慮到資料庫被查詢的次數要遠大於更新的次數。因此,ISAM執行讀取操作的速度很快,而且不佔用大量的記憶體和儲存資源。

ISAM的兩個主要不足之處在於它不支援事務處理,也不能夠容錯:如果硬碟崩潰,資料檔案就無法恢復。如果正在把ISAM用在關鍵任務應用程式裡,必須經常備份所有的實時資料,通過其複製特性,MYSQL能夠支援這樣的備份應用程式。 

MyISAM:MyISAM是MySQL的ISAM擴充套件格式和預設的資料庫引擎。除了提供ISAM裡所沒有的索引和欄位管理的大量功能,MyISAM還使用一種表格鎖定的機制,來優化多個併發的讀寫操作,其代價是需要經常執行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間。MyISAM還有一些有用的擴充套件,例如用來修復資料庫檔案的MyISAMCHK工具和用來恢復浪費空間的 MyISAMPACK工具。MYISAM強調了快速讀取操作,這可能就是為什麼MySQL受到了WEB開發如此青睞的主要原因:在WEB開發中你所進行的大量資料操作都是讀取操作。所以,大多數虛擬主機提供商和INTERNET平臺提供商只允許使用MYISAM格式。MyISAM格式的一個重要缺陷就是不能在表損壞後恢復資料。  

HEAPHEAP允許只駐留在記憶體裡的臨時表格。駐留在記憶體裡讓HEAP要比ISAM和MYISAM都快,但是它所管理的資料是不穩定的,而且如果在關機之前沒有進行儲存,那麼所有的資料都會丟失。在資料行被刪除的時候,HEAP也不會浪費大量的空間。HEAP表格在你需要使用SELECT表示式來選擇和操控資料的時候非常有用。要記住,在用完表格之後就刪除表格。

InnoDB:InnoDB資料庫引擎都是造就MySQL靈活性的技術的直接產品,這項技術就是MYSQL+API。InnoDB包括了對事務處理和外來鍵的支援,這兩點都是ISAM和MyISAM引擎所沒有的。

以下詳述MyISAM和InnoDB的區別

InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表型別,這兩個表型別各有優劣,視具體應用而定。

基本的差別為:MyISAM型別不支援事務處理等高階處理,而InnoDB型別支援。MyISAM型別的表強調的是效能,其執行數度比InnoDB型別更快,但是不提供事務支援,而InnoDB提供事務支援以及外部鍵等高階資料庫功能。

兩種型別最主要的差別就是Innodb支援事務處理(ACID)與外來鍵和行級鎖,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖全表, 例如update table set num=1 where name like “%a%”;而MyISAM(整表鎖)不支援。

MyISAM引擎的索引結構為B+Tree,其中B+Tree的資料域儲存的內容為實際資料的地址,也就是說它的索引和實際的資料是分開的,只不過是用索引指向了實際的資料,這種索引就是所謂的非聚集索引。MyISAM管理非事務表。它提供高速儲存和檢索,以及全文搜尋能力。

select count(*) from table,MyISAM只要簡單的讀出儲存好的行數,注意的是,當count(*)語句包含  where條件時,兩種表的操作是一樣的。

一般來說,MyISAM(非聚簇索引)適合

(1)做很多count 的計算;

(2)插入不頻繁,查詢非常頻繁;

(3)沒有事務。

InnoDB(聚簇索引)適合:

(1)可靠性要求比較高,或者要求事務;

(2)表更新和查詢都相當的頻繁,並且表鎖定的機會比較大的情況指定資料引擎的建立。

  • 聚簇索引和非聚簇索引的區別:

聚簇索引的葉節點就是資料節點,而非聚簇索引的葉節點仍然是索引節點,並保留一個連結指向對應資料塊。

非聚簇索引就是指B+Tree的葉子節點上的data,並不是資料本身,而是資料存放的地址。主索引和輔助索引沒啥區別,只是主索引中的key一定得是唯一的。主要用在MyISAM儲存引擎中。如下圖,注意下圖中聚餐索引中葉節點沒有箭頭指向,直接是對應的資料,而非聚簇索引有箭頭指向,即索引節點指向對應的資料塊。(圖片來源:https://blog.csdn.net/lisuyibmd/article/details/53004848):

聚簇索引的資料的物理存放順序與索引順序是一致的,即:只要索引是相鄰的,那麼對應的資料一定也是相鄰地存放在磁碟上的。聚簇索引要比非聚簇索引查詢效率高很多。 聚集索引這種主+輔索引的好處是,當發生資料行移動或者頁分裂時,輔助索引樹不需要更新,因為輔助索引樹儲存的是主索引的主鍵關鍵字,而不是資料具體的實體地址。

非聚集索引類似於圖書的附錄,那個專業術語出現在哪個章節,這些專業術語是有順序的,但是出現的位置是沒有順序的。每個表只能有一個聚簇索引,因為一個表中的記錄只能以一種物理順序存放。但是,一個表可以有不止一個非聚簇索引。