数据库02——InnoDB 和 MyISAM

164 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

MySQL的两种存储引擎 InnoDB 和 MyISAM 的区别?

  • InnoDB支持事务外键表级锁、行级锁热备份,使用聚集索引;
  • MyISAM 只支持表级锁;支持压缩表空间和索引,使用非聚集索引;
  • MyISAM 崩溃损坏的概率更高故障恢复很慢

应用场景

  • InnoDB ,支持事务外键故障恢复更快,适用于并发操作数据库数据量很大时,综合考虑可用性扩展性InnoDB更好
  • MyISAM强调性能,提供高速存储全文检索如果表比较小或者只读数据(有大量的查询)使用MyISAM;(每次查询具有原子性)。

InnDB和MyISAM的底层结构

MyISAM:索引文件数据文件分离的(非聚集),B+树的叶节点存放对应数据在磁盘中的地址

索引检索算法:先按照B+树搜索算法搜索索引,如果指定的Key存在,则取出其叶子结点保存的地址,然后根据地址读取数据。(主键索引和辅助索引结构一致)

img

InnoDB:使用聚集索引数据的物理排序和聚集索引排序一致,B+树叶节点保存了整行数据

索引检索算法:先查找二级索引获得主键,然后用主键到聚集索引读取数据

因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则mysql会自动选择一个可以唯一标识数据记录的列作为主键.(主键索引存完整数据,二级索引存key)

img

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支持行锁,在检查锁时需要同时检查行锁与表锁并发操作时加锁、减锁、检查锁的消耗也很大

热备份和冷备份

  • 热备份在数据库运行的情况下备份优点备份时数据库仍可使用,可恢复至任一时间点。
  • 冷备份数据库正常关闭后将关键性文件复制到另一位置优点:操作简单快速,恢复简单