咱們這裏關注B+樹的兩個特性:html
以用戶表爲例,id
爲主鍵,另外name存在索引idx_name
:mysql
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] 。併發
與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