目錄
- 索引對比
- 鎖對比
- 事務對比
- 并發
- 全文索引對比
- 外鍵
- 其他
一.索引對比
1.B+樹概念
我們這里關注B+樹的兩個特性:
- 葉子節點包含資料data(data并不特指資料庫中的某一行資料,也可以是某個數值,指標等)
- 葉子節點均在同一層,且每個節點均可以直接找到上一個或者下一個節點(雙向指標,比常規的B+樹多了一個指向上一個的指標)

2.Innodb
以用戶表為例,id為主鍵,另外name存在索引idx_name:
CREATE TABLE `t_user` (
`id` bigint,
`name` varchar(10),
`age` int,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`)
);
插入資料:
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存放的均是資料行地址,
主鍵索引:

普通索引:

二.鎖對比
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
https://www.cnblogs.com/leonandyou/p/11337273.html
https://www.cnblogs.com/balfish/p/8288891.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/70585.html
標籤:MySQL
