存储引擎
存储引擎决定了数据如何存放,用什么格式文件存放,文件存放在哪里。mysql 支持多种存储引擎,常用的有innodb
、myisam
和memory
。
memory
相当于内存级数据库,把数据都放到内存中,性能很高,但是无法持久化,掉电易失。
innodb
是最常用,也是默认使用的存储引擎。
InnoDB与MyISAM差异
两者差异点很多,下面依次罗列:
- 事务和外键
InnoDB支持事务和外键;MyISAM都不支持。 - 全文索引
MyISAM支持全文索引;InnoDB从5.7开始才支持全文索引。 - 锁
MyISAM是表级锁;InnoDB默认是行级锁,当用不到索引时会变成表级锁,因为InnoDB锁的是索引。 - 存储
MyISAM用到的存储文件后缀为.MYI
和.MYD
,分别保存索引和数据;InnoDB中用.ibd
文件存储索引和数据。 - 索引
MyISAM是非聚簇索引;InnoDB是聚簇索引。 - B+树
两者索引的底层数据结构都是B+树,MyISAM中叶子节点存储的是整行数据的地址;InnoDB中叶子节点存储的是整行数据。 - 回表
MyISAM索引B+树中存储的是行数据地址,因此即使是辅助索引,也可以根据地址直接找到行数据,因此不存在回表;InnoDB中辅助索引叶子节点为了节约空间,存储的是主键索引值而非整行数据,因此存在回表操作。 - 并发
MyISAM读写互斥阻塞,通过配置可实现读和插入并发;InnoDB读写阻塞情况与事务隔离级别有关。 - 场景选择
MyISAM适合大量读、并发不高的场景;InnoDB适合大量更新、并发较高的场景。
InnoDB | MyISAM | |
---|---|---|
索引类型 | 聚簇索引 | 非聚簇索引 |
回表 | 存在 | 不存在 |
支持事务 | 是 | 否 |
支持表锁 | 是 | 是 |
支持行锁 | 是 | 否 |
支持外键 | 是 | 否 |
支持全文索引 | 是(5.7开始支持) | 是 |
适合操作类型 | 大量 insert、delete、update | 大量 select |
为什么MyISAM读比InnoDB快
InnoDB在做SELECT的时候,要维护的东西比MYISAM引擎多很多:
- InnoDB 要缓存数据和索引;MyISAM只缓存索引块,这中间还有换进换出的减少
- InnoDB 寻址要映射到块,再到行;MyISAM记录的直接是文件的OFFSET,定位比InnoDB要快(不确定)
- InnoDB 还需要维护MVCC一致;MyISAM完全没这东西
- InnoDB 在使用辅助索引时需要进行回表;MyISAM无需回表便可直接获取行数据