本文已参与「新人创作礼」活动,一起开启掘金创作之路。
MySQL的两种存储引擎 InnoDB 和 MyISAM 的区别?
- InnoDB支持
事务,外键、 表级锁、行级锁、热备份,使用聚集索引; - MyISAM 只支持表级锁;支持压缩表空间和索引,使用非聚集索引;
- MyISAM 崩溃后损坏的概率更高,故障恢复很慢;
应用场景
- InnoDB ,支持事务、外键、故障恢复更快,适用于并发操作数据库,数据量很大时,综合考虑可用性和扩展性InnoDB更好
- MyISAM ,强调性能,提供高速存储和全文检索。如果
表比较小或者只读数据(有大量的查询)使用MyISAM;(每次查询具有原子性)。
InnDB和MyISAM的底层结构
MyISAM:索引文件和数据文件是分离的(非聚集),B+树的叶节点存放对应数据在磁盘中的地址。
索引检索算法:先按照B+树搜索算法搜索索引,如果指定的Key存在,则取出其叶子结点保存的地址,然后根据地址读取数据。(主键索引和辅助索引结构一致)
InnoDB:使用聚集索引,数据的物理排序和聚集索引排序一致,B+树叶节点保存了整行数据。
索引检索算法:先查找二级索引获得主键,然后用主键到聚集索引读取数据。
因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则mysql会自动选择一个可以唯一标识数据记录的列作为主键.(主键索引存完整数据,二级索引存key)
B+树查找的时间复杂度
B+树是m叉树,m/2*log(m)n,m为常数,所以时间复杂度是O(logn)
B+树是m叉树,层数log(m)n,每一层平均m/2,所以一共是(m/2) * log(m)n,由于m是常数,所以复杂度O(log n),即以2为底n的对数。
为什么MyISAM引擎查询比InnoDB引擎更快?
(1)索引
InnoDB:使用索引时,先使用二级索引查询key,再使用聚集索引找到数据。
MyISAM:使用非聚集索引查询到的是数据在磁盘中的地址,然后直接根据地址获取数据。
(2)事务
innodb支持事务,查询时需要维护MVCC(即使没有使用事务),损耗性能。
(3)行锁
Innodb支持行锁,在检查锁时需要同时检查行锁与表锁,并发操作时加锁、减锁、检查锁的消耗也很大。
热备份和冷备份
- 热备份:在数据库运行的情况下备份。优点:备份时数据库仍可使用,可恢复至任一时间点。
- 冷备份:数据库正常关闭后将关键性文件复制到另一位置。优点:操作简单快速,恢复简单