mysql儲存引擎:myIsam和innodb的區別

藏色散人
發布: 2019-04-18 09:09:06
轉載
4033 人瀏覽過

MySQL有多種儲存引擎,MyISAM和InnoDB是其​​中常用的兩種。這裡介紹關於這兩種引擎的一些基本概念(非深入介紹)。

MyISAM是MySQL的預設儲存引擎,基於傳統的ISAM類型,支援全文搜索,但不是事務安全的,而且不支援外鍵。每張MyISAM表存放在三個文件中:frm 文件存放表格定義;資料檔是MYD (MYData);索引文件是MYI (MYIndex)。

InnoDB是事務型引擎,支援回滾、崩潰復原能力、多版本並發控制、ACID事務,支援行級鎖定(InnoDB表的行鎖不是絕對的,如果在執行一個SQL語句時MySQL無法確定要掃描的範圍,InnoDB表同樣會鎖定全表,如like操作時的SQL語句),以及提供與Oracle類型一致的不加鎖讀取方式。 InnoDB儲存它的表和索引在一個表空間中,表空間可以包含數個檔案。

核心差異

MyISAM是非事務安全型的,而InnoDB是事務安全型的。

MyISAM鎖定的粒度是表級,而InnoDB支援行級鎖定。

MyISAM支援全文類型索引,而InnoDB不支援全文索引。

MyISAM相對簡單,所以在效率上要優於InnoDB,小型應用可以考慮使用MyISAM。

MyISAM表格是保存成檔案的形式,在跨平台的資料轉移中使用MyISAM儲存會省去不少的麻煩。

InnoDB表比MyISAM表更安全,可以在保證資料不會遺失的情況下,切換非交易表到交易表(alter table tablename type=innodb)。

應用場景

MyISAM管理非事務表。它提供高速儲存和檢索,以及全文搜尋能力。如果應用程式中需要執行大量的SELECT查詢,那麼MyISAM是更好的選擇。

InnoDB用於事務處理應用程序,具有眾多特性,包括ACID事務支援。如果應用程式中需要執行大量的INSERT或UPDATE操作,則應該使用InnoDB,這樣可以提高多使用者並發操作的效能。

Mysql的儲存引擎和索引

資料庫必須有索引,沒有索引則檢索過程變成了順序查找,O(n)的時間複雜度幾乎是不能忍受的。我們非常容易想像出一個只有單一關鍵字組成的表格如何使用B 樹進行索引,只要將關鍵字儲存到樹的節點即可。當資料庫一筆記錄包含多個字段時,一棵B 樹就只能儲存主鍵,如果檢索的是非主鍵字段,則主鍵索引失去作用,又變成順序查找了。這時應該在第二個要檢索的欄位上建立第二套索引。這個索引由獨立的B 樹來組織。有兩種常見的方法可以解決多個B 樹存取相同套表資料的問題,一種稱為叢集索引(clustered index ),一種稱為非叢集索引(secondary index)。這兩個名字雖然都叫做索引,但這不是一種單獨的索引類型,而是一種資料儲存方式。對於叢集索引儲存來說,行資料和主鍵B 樹儲存在一起,輔助鍵B 樹只儲存輔助鍵和主鍵,主鍵和非主鍵B 樹幾乎是兩種類型的樹。對於非聚集索引儲存來說,主鍵B 樹在葉子節點儲存指向真正資料行的指針,而非主鍵。

InnoDB使用的是叢集索引,將主鍵組織到一棵B 樹中,而行資料就儲存在葉子節點上,若使用"where id = 14"這樣的條件查找主鍵,則依照B 樹的檢索演算法即可找出對應的葉節點,之後再取得行資料。若對Name列進行條件搜索,則需要兩個步驟:第一步在輔助索引B 樹中檢索Name,到達其葉子節點以取得對應的主鍵。第二步驟使用主鍵在主索引B 樹種再執行一次B 樹檢索操作,最後到達葉子節點即可取得整行資料。

MyISM使用的是非叢集索引,非叢集索引的兩棵B 樹看起來沒什麼不同,節點的結構完全一致只是儲存的內容不同而已,主鍵索引B 樹的節點儲存了主鍵,輔助鍵索引B 樹儲存了輔助鍵。表數據儲存在獨立的地方,這兩顆B 樹的葉子節點都使用一個位址指向真正的表數據,對於表數據來說,這兩個鍵沒有任何差別。由於索引樹是獨立的,透過輔助鍵檢索無需存取主鍵的索引樹。

為了更形象說明這兩種索引的區別,我們假想一個表格如下圖儲存了4行資料。其中Id作為主索引,Name作為輔助索引。圖示清晰的顯示了聚集索引和非聚集索引的差異。

mysql儲存引擎:myIsam和innodb的區別

我們專注於聚集索引,看上去叢集索引的效率明顯要低於非叢集索引,因為每次使用輔助索引擷取都要經過兩次B 樹查找,不是多此一舉嗎?聚集索引的優點在哪裡?

1 由於行數據和葉子節點存儲在一起,這樣主鍵和行數據是一起被載入內存的,找到葉子節點就可以立刻將行數據返回了,如果按照主鍵Id來組織數據,獲得數據更快。

2 輔助索引使用主鍵作為"指標" 而不是使用位址值作為指標的好處是,減少了當出現行移動或資料頁分裂時輔助索引的維護工作,使用主鍵值作為指標會讓輔助索引佔用更多的空間,換來的好處是InnoDB在移動行時無須更新輔助索引中的這個"指標"。也就是說行的位置(實作中透過16K的Page來定位,後面會涉及)會隨著資料庫裡資料的修改而改變(前面的B 樹節點分裂以及Page的分裂),使用叢集索引就可以保證不管這個主鍵B 樹的節點如何變化,輔助索引樹都不受影響。

所以在百萬級資料及更大資料情況下,mysql innoDB 的索引表現更加優秀!

以上是mysql儲存引擎:myIsam和innodb的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:hcoder.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!