1. 程式人生 > >資料庫引擎比較詳解--MyISAM與InnoDB

資料庫引擎比較詳解--MyISAM與InnoDB

 MyISAM:

  • 1.MyISAM索引(非聚集索引):MyISAM引擎使用B+Tree作為索引結構,葉節點的data域存放的是資料記錄的地址。索引和資料是分開的,並且索引是有壓縮的。

這裡設表一共有三列,假設我們以Col1為主鍵,則上圖是一個MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引檔案僅僅儲存資料記錄的地址。在MyISAM中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重複。因此,MyISAM中索引檢索的演算法為首先按照B+Tree搜尋演算法搜尋索引,如果指定的Key存在,則取出其data域的值,然後以data域的值為地址,讀取相應資料記錄。MyISAM的索引方式也叫做“非聚集”的。

  • 2. MyISAM型別的表強調的是效能,其執行速度比InnoDB型別更快,但是不提供事務支援,也不支援外來鍵
  • 3. MyISAM 是表級鎖不會出現死鎖問題
  • 4. MyISAM儲存表的全部行數
  • 5. MyISAM表是儲存成檔案的形式,在跨平臺的資料轉移中使用MyISAM儲存直接複製。

InnoDB:

  • 1.  InnoDB索引實現(聚集索引):InnoDB也使用B+Tree作為索引結構。但是InnoDB的資料檔案本身就是索引檔案。在InnoDB中,表資料檔案本身就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域儲存了完整的資料記錄。這個索引的key是資料表的主鍵,因此InnoDB表資料檔案本身就是主索引。

因為InnoDB的資料檔案本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含欄位作為主鍵

InnoDB的輔助索引data域儲存相應記錄主鍵的值而不是地址,聚集索引這種實現方式使得按主鍵的搜尋十分高效,但是輔助索引搜尋需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然後用主鍵到主索引中檢索獲得記錄。不建議使用過長的欄位作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大


  • 2.Innodb 支援事務處理:事務支援commit,rollback和crashrecovery,從而保護使用者數
  • 3.基於行鎖以及類似oracle的一致性讀:提升了多使用者的併發和效能
  • 4. InnoDB也支援外來鍵。如果使用了外來鍵,insert,update以及delete操作都會得到檢查,以確保不會導致多表之間的資料不一致。
  • 5. InnoDB儲存引擎維護了它自己的bufferpool(緩衝池),用來在記憶體中快取資料和索引。經常使用的資料直接從記憶體中進行處理以便加快處理速度。
  • 6. InnoDB支援crash recovery(崩潰修復),以便在資料庫出現故障的時候,可以直接進行重啟即可,資料不會丟失。在恢復的時候,可以提交已經commit的請求,回滾任何還未commit的請求。
  • 7. InnoDB 中不儲存表的具體行數也就是說,執行selectcount(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是當count(*)語句包含 where條件時,兩種引擎的操作是一樣的。

聚集索引與非聚集索引:

  • 聚集索引:資料行的物理順序與列值(一般是主鍵的那一列)的邏輯順序相同,一個表中只能擁有一個聚集索引。
  • 非聚集索引:該索引中索引的邏輯順序與磁碟上行的物理儲存順序不同,一個表中可以擁有多個非聚集索引。
  • 按照定義,除了聚集索引以外的索引都是非聚集索引
  • 非聚集索引:分成普通索引,唯一索引,全文索引。非聚集索引就像新華字典的偏旁字典,結構順序與實際存放順序不一定一致。

MVCC:多版本併發控制

先理解併發和並行的區別

  • 併發的關鍵是你有處理多個任務的能力,不一定要同時。
  • 並行的關鍵是你有同時處理多個任務的能力。
  • 所以它們最關鍵的點就是 是否『同時』。

InnoDB的MVCC,是通過在每行記錄後面儲存兩個隱藏的列來實現的,這兩個列,分別儲存了這個行的建立時間,一個儲存的是行的刪除時間。這裡儲存的並不是實際的時間值,而是系統版本號(可以理解為事務的ID),沒開始一個新的事務,系統版本號就會自動遞增,事務開始時刻的系統版本號會作為事務的ID.

SELECT

InnoDB會根據以下兩個條件檢查每行記錄:
a.InnoDB只會查詢版本早於當前事務版本的資料行(也就是,行的系統版本號小於或等於事務的系統版本號),這樣可以確保事務讀取的行,要麼是在事務開始前已經存在的,要麼是事務自身插入或者修改過的.
b.行的刪除版本要麼未定義,要麼大於當前事務版本號,這可以確保事務讀取到的行,在事務開始之前未被刪除.
只有a,b同時滿足的記錄,才能返回作為查詢結果.

DELETE

InnoDB會為刪除的每一行儲存當前系統的版本號(事務的ID)作為刪除標識.