MySQL中InnoDB和MyISAM引擎的對比

目錄

  • 索引對比
  • 鎖對比
  • 事務對比
  • 併發
  • 全文索引對比
  • 外鍵
  • 其餘

一.索引對比

1.B+樹概念

咱們這裏關注B+樹的兩個特性:html

  1. 葉子節點包含數據data(data並不特指數據庫中的某一行數據,也能夠是某個數值,指針等)
  2. 葉子節點均在同一層,且每一個節點都可以直接找到上一個或者下一個節點(雙向指針,比常規的B+樹多了一個指向上一個的指針)

2.Innodb

以用戶表爲例,id爲主鍵,另外name存在索引idx_namemysql

CREATE TABLE `t_user` (
  `id` bigint,
  `name` varchar(10),
  `age` int,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`)
);

插入數據:sql

insert into t_user (id,`name`,age) values
(1,'n7',10),
(2,'n6',20),
(3,'n5',30),
(4,'n4',40),
(5,'n3',50),
(6,'n2',60),
(7,'n1',70)

①聚簇索引(彙集索引)

聚簇索引:行數據與鍵值(主鍵)緊湊地存儲在一塊兒;數據庫

InnoDB中表現爲:B+樹葉子節點的data用於存放行數據(包含主鍵值、其餘列數據、回滾指針、事務id等),物理上索引數據與行數據都放在同一個文件中(.ibd安全

若是沒有定義主鍵,InnoDB會選擇一個非空的惟一索引代替。若是沒有這樣的索引,InnoDB會隱式定義一個主鍵(DB_ROW_ID)來做爲聚簇索引。

②輔助索引

與聚簇索引最大的不一樣是:B+樹的data存放的並非行數據,而是主鍵值數據結構

select * from t_user where name='n1'時,會先經過idx_name索引找到n1對應的主鍵的值(id=7),再經過主鍵值找到行數據 [7,n1,70] 。併發

3.MyISAM 索引

與InnoDB不一樣,MyISAM並不使用聚簇索引,MyISAM的索引數據和行數據是分開的,物理上分別爲.myi索引數據文件和.myd行數據文件(InnoDB 索引和行數據均在.idb文件中)性能

MyISAM中,主鍵索引和其餘的通常索引在數據結構上並沒有什麼區別,B+樹的data存放的均是數據行地址插件

主鍵索引:3d

普通索引:

二.鎖對比

mysql支持三種鎖定級別,行級、頁級、表級;

MyISAM支持表級鎖定,提供與 Oracle 類型一致的不加鎖讀取(non-locking read in SELECTs)

InnoDB支持行級鎖,但值得注意的是InnoDB的行鎖是加到索引上的,因此在某次查找時沒有用上索引,InnoDB表一樣會鎖全表。

三.事務對比

InnoDB具備事務,支持4個事務隔離級別,回滾,崩潰修復能力和多版本併發的事務安全,包括ACID。若是應用中須要執行大量的INSERT或UPDATE操做,則應該使用InnoDB,以事務爲單位操做能夠提升多用戶併發操做的性能。

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

四.併發

MyISAM讀寫互相阻塞:不只會在寫入的時候阻塞讀取,MyISAM還會在讀取的時候阻塞寫入,但讀自己並不會阻塞另外的讀。

InnoDB 讀寫阻塞與事務隔離級別相關。

五.全文索引

MyISAM支持FULLTEXT類型的全文索引

InnoDB不支持FULLTEXT類型的全文索引,可是InnoDB可使用sphinx插件支持全文索引,而且效果更好

六.外鍵

MyISAM不支持

InnoDB支持

七.其餘

InnoDB不保存表的具體行數,執行select count(*) from table時須要全表掃描。

MyISAM用一個變量保存了整個表的行數,執行上述語句時只須要讀出該變量便可,速度很快;

站在巨人的肩膀上摘蘋果:

https://www.jianshu.com/p/8e054da3da05

http://www.javashuo.com/article/p-plxnngjn-ks.html

http://www.javashuo.com/article/p-temtqzbo-ev.html

相關文章
相關標籤/搜索