1. 程式人生 > >mysq兩種引擎(MyISAM,InnoDb)的區別

mysq兩種引擎(MyISAM,InnoDb)的區別

MyISAM:

優點:查詢資料相對較快,適合大量的select,可以全文索引。

缺點:不支援事務,不支援外來鍵,併發量較小,不適合大量update 

  1. 不支援事務,但是每次查詢都是原子的;
  2. 只支援表級鎖,即每次操作是對整個表加鎖;讀鎖和寫鎖
  3. 儲存表的總行數;
  4. 一個MYISAM表有三個檔案:索引檔案、表結構檔案、資料檔案;
  5. 採用非聚集索引,索引檔案的資料域儲存指向資料檔案的指標。輔索引與主索引基本一致,但是輔索引不用保證唯一性。
  6. MyISAM表不太適合於有大量更新操作和查詢操作,因為,一個程序請求某個MyISAM表的讀鎖,同時另一個程序也請求同一表的寫鎖,MySQL如何處理呢?答案是寫程序先獲得鎖。不僅如此,即使讀請求先到鎖等待佇列,寫請求後到,寫鎖也會插到讀鎖請求之前,這樣在如果有大量的更新操作會造成查詢操作很難獲得讀鎖,從而可能永遠阻塞。
    這種情況有時可能會變得非常糟糕!

InnoDb:

  1. 支援ACID的事務,支援事務的四種隔離級別;
  2. 支援行級鎖及外來鍵約束:因此可以支援寫併發;InnoDB行鎖是通過給索引項加鎖來實現的,即只有通過索引條件檢索資料,InnoDB才使用行級鎖,否則將使用表鎖!行級鎖在每次獲取鎖和釋放鎖的操作需要消耗比表鎖更多的資源。在InnoDB兩個事務發生死鎖的時候,會計算出每個事務影響的行數,然後回滾行數少的那個事務。當鎖定的場景中不涉及Innodb的時候,innodb是檢測不到的。只能依靠鎖定超時來解決INNODB的行級鎖是有條件的。在where條件沒有使用主鍵時,照樣會鎖全表。比如DELETE FROM mytable這樣的刪除語句
  3. 不儲存總行數;兩種引擎在執行select count(*) where *   時所進行的操作是一樣的,都要遍歷整張表
  4. 一個InnoDb引擎儲存在一個檔案空間(共享表空間,表大小不受作業系統控制,一個表可能分佈在多個檔案裡),也有可能為多個(設定為獨立表空,表大小受作業系統檔案大小限制,一般為2G),受作業系統檔案大小的限制;
  5. 主鍵索引採用聚集索引(索引的資料域儲存資料檔案本身),輔索引的資料域儲存主鍵的值;因此從輔索引查詢資料,需要先通過輔索引找到主鍵值,再訪問輔索引;最好使用自增主鍵,防止插入資料時,為維持B+樹結構,檔案的大調整。
  6. InnoDB不支援FULLTEXT型別的索引
  7. 對於AUTO_INCREMENT型別的欄位,InnoDB中必須包含只有該欄位的索引,但是在MyISAM表中,可以和其他欄位一起建立聯合索引
  8. 清空整個表時,InnoDB是一行一行的刪除,效率非常慢。MyISAM則會重建表

應用場景

  1. MyISAM適合讀密集型的表,而InnoDB適合寫密集型的表
  2. 需要鎖定、事務時,InnoDB是更好的選擇
  3. 在資料庫做主從分離的情況下,選擇MyISAM引擎作為主庫的儲存引擎 
  4. 如果應用程式對查詢效能要求較高,就要使用MYISAM了。MYISAM索引和資料是分開的,而且其索引是壓縮的,可以更好地利用記憶體。所以它的查詢效能明顯優於INNODB。壓縮後的索引也能節約一些磁碟空間。MYISAM擁有全文索引的功能,這可以極大地優化LIKE查詢的效率